Mac下g++编译是否自动包含库?未引limits为何可编译?
问题:Mac下未引入
<limits>头文件,g++却能编译通过? 我写了一段C++代码:
#include <iostream> using namespace std; int main() { //... cin.ignore(numeric_limits<streamsize>::max(), '\n'); //... }
这段代码在Mac的g上编译能正常通过,但在学校电脑编译时会报错“'>'未声明”,引入<limits>头文件后两边都能正常编译。我想知道:Mac的g是否会自动包含某些库?如果会的话,怎么查询它自动包含的内容?
我的Mac上g++版本信息如下:
NoobCoders-MacBook-Pro:as1 NoobCoder$ g++ -v Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 8.0.0 (clang-800.0.42.1) Target: x86_64-apple-darwin15.6.0 Thread model: posix InstalledDir: /Library/Developer/CommandLineTools/usr/bin
解答
其实你这里的情况挺典型的——Mac上的“g++”并不是真正的GNU GCC,从你的版本信息里能看到,它实际是Apple LLVM(也就是Clang)的前端伪装成了g的样子,背后用的是libc标准库实现。
为什么Mac上能编译通过?
Clang的libc标准库会在一些常用头文件里间接包含其他相关头文件,比如你引入的<iostream>,在libc的实现里可能已经通过某个中间头文件(比如<ios>或者其他内部头)间接包含了<limits>,所以你不需要手动引入也能使用numeric_limits。而学校电脑用的应该是GNU的libstdc++标准库,它的<iostream>不会自动包含<limits>,所以必须手动引入才能编译通过。
怎么查询自动包含的内容?
有两种实用的方法:
- 用预编译命令查看预处理结果:
运行以下命令把代码预处理后的完整内容输出到文件里:
然后打开生成的g++ -E your_source.cpp > preprocessed_output.cpppreprocessed_output.cpp,搜索numeric_limits或者<limits>,就能追踪到它是被哪个头文件引入的——预处理后的代码会保留所有被包含的头文件路径和内容。 - 直接查看系统头文件的实现:
从你的g++配置信息里能看到头文件目录是/usr/include/c++/4.2.1/,你可以直接打开这个目录下的<iostream>文件,看看它里面包含了哪些其他头文件,顺着这些头文件找下去就能发现<limits>是被哪个文件间接引入的。
内容的提问来源于stack exchange,提问作者noobcoder
相关产品推荐
相关产品推荐

