我正在Visual Studio Code中学习C++。我有这个简单的代码来生成一个随机数。现在我忘记了#include
<time>
和<cstdlib>
。不过,汇编是成功的。我读到过,这可能是“由于编译器的标准库隐式包含了这些头文件”。
有没有可能真正启用隐式包含头文件的编译器警告?我也读了下面的内容,感觉不对:
在大多数C++编译器中,没有专门针对丢失头文件而触发的特定警告。如果省略显式包含必需的头文件,编译器通常不会将此行为视为错误或警告。相反,编译器依赖于通过其他包含的头或标准库实现来隐式包含头。
这是我的tasks.json
,我一直在尝试新的flags for warning options,但似乎没有解决这个问题:
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-fdiagnostics-color=always",
"-g",
"${file}",
"-o",
"${fileDirname}/${fileBasenameNoExtension}",
"-ftime-report",
// "-ftime-report-details",
"-Wall",
"-Wextra",
"-Wuninitialized",
"-Wnarrowing",
"-Wconversion",
"-Wswitch",
"-Wswitch-enum",
"-Wpedantic",
// "-Werror",
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
“我读过”意味着ChatGPT告诉我-我找不到在线文档。
1条答案
按热度按时间sy5wg1nm1#
C标准允许标准库实现有一个标准库头包含另一个标准库头,或者让它导入比为该头指定的更多的标准库名称。如果没有这个权限,将很难合理地实现C标准库。
因此,如果您使用的是根据规范仅在
<cstdlib>
中声明的内容,但您包含了另一个标准库头文件,那么无论如何都可以声明该内容。如果必须保证可移植性(也包括标准库版本),则程序员有责任检查规范并包括正确的标准库头。编译器并没有一个内部Map,将所有C++头文件Map到它们根据标准保证提供的库设施。据我所知,没有一个编译器对此有警告。然而,可能存在知道此Map的外部工具。
即使你设法解决了标准库本身的问题,你仍然会遇到与用户头完全相同的问题,你自己的以及来自其他库的。例如,如果你有
#include<libA.h>
,那么libA.h
很可能会包含一些标准库头,因此会声明标准库的元素,否则这些元素不会被声明,因为你忘记在文件中添加正确的#include
。因为#include
是在预处理步骤中完成的简单文本替换,所以跟踪声明应该公开附加到哪个#include
是很棘手的。最后,您通常不能依赖任何工具。你需要自己验证。或者,根据可移植性的问题程度,您可以简单地等待,直到它无法在某些系统上构建。