为什么这个C代码与一些编译器编译而不是其他编译器?
发布时间:2020-12-16 10:37:13 所属栏目:百科 来源:网络整理
导读:我在做作业时注意到我的笔记本电脑上的编译器比我们预期用于提交的机器上的编译器更宽松.我的笔记本电脑上的C编译器是AppleClang 7.0.2.7000181,提交框上的编译器是g 4.9.2.回想起来不应该编译的代码是: #include iostreamstd::tupleint,int foo() { return
我在做作业时注意到我的笔记本电脑上的编译器比我们预期用于提交的机器上的编译器更宽松.我的笔记本电脑上的C编译器是AppleClang 7.0.2.7000181,提交框上的编译器是g 4.9.2.回想起来不应该编译的代码是:
#include <iostream> std::tuple<int,int> foo() { return std::make_tuple(1,1); } int main() { auto pair = foo(); int x = std::get<0>(pair); int y = std::get<1>(pair); std::cout << x << "," << y << std::endl; return 0; } 我也有一个CMakeLists.txt: cmake_minimum_required(VERSION 2.8) project(foo) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14 -Wall -Werror -Werror=sign-compare") set(SOURCE_FILES main.cpp) add_executable(foo ${SOURCE_FILES}) 在我的笔记本电脑上,Clang愉快地编译了这段代码并打印出1,1.没有错误,没有警告,没有.在提交框中,我没那么幸运. /home/nate/foo/main.cpp: In function 'std::tuple<int,int> foo()': /home/nate/foo/main.cpp:3:26: error: return type 'class std::tuple<int,int>' is incomplete std::tuple<int,int> foo() { ^ /home/nate/foo/main.cpp:4:12: error: 'make_tuple' is not a member of 'std' return std::make_tuple(1,1); ^ /home/nate/foo/main.cpp: In function 'int main()': /home/nate/foo/main.cpp:8:21: error: 'void pair' has incomplete type auto pair = foo(); ^ /home/nate/foo/main.cpp:9:13: error: 'get' is not a member of 'std' int x = std::get<0>(pair); ^ /home/nate/foo/main.cpp:10:13: error: 'get' is not a member of 'std' int y = std::get<1>(pair); ^ 这些错误是有道理的,因为我没有包含元组头,但我不明白为什么这个代码在我的笔记本电脑上完全编译.这里发生了什么? 解决方法
不同的编译器有不同的头文件. C头文件与您正在使用的编译器密切相关.
你可能拥有的是Clang的< iostream>本身#include元组头文件,无论出于何种原因;因此,引用std :: tuple的代码只会通过#includeing< iostream>来快乐编译.头. 当然,这将依赖于编译器的特定行为. 不同的编译器有不同的头文件. C标准不禁止一个头文件自动包含另一个头文件;但是为了使用特定的类,模板或其他资源,确保代码可以引用此类,模板或其他资源的唯一方法是明确包含其头文件. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |