对于隐式未声明头文件的GCC警告

q3aa0525  于 2023-05-18  发布在  其他
关注(0)|答案(1)|浏览(159)

我正在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告诉我-我找不到在线文档。

sy5wg1nm

sy5wg1nm1#

C标准允许标准库实现有一个标准库头包含另一个标准库头,或者让它导入比为该头指定的更多的标准库名称。如果没有这个权限,将很难合理地实现C标准库。
因此,如果您使用的是根据规范仅在<cstdlib>中声明的内容,但您包含了另一个标准库头文件,那么无论如何都可以声明该内容。如果必须保证可移植性(也包括标准库版本),则程序员有责任检查规范并包括正确的标准库头。
编译器并没有一个内部Map,将所有C++头文件Map到它们根据标准保证提供的库设施。据我所知,没有一个编译器对此有警告。然而,可能存在知道此Map的外部工具。
即使你设法解决了标准库本身的问题,你仍然会遇到与用户头完全相同的问题,你自己的以及来自其他库的。例如,如果你有#include<libA.h>,那么libA.h很可能会包含一些标准库头,因此会声明标准库的元素,否则这些元素不会被声明,因为你忘记在文件中添加正确的#include。因为#include是在预处理步骤中完成的简单文本替换,所以跟踪声明应该公开附加到哪个#include是很棘手的。
最后,您通常不能依赖任何工具。你需要自己验证。或者,根据可移植性的问题程度,您可以简单地等待,直到它无法在某些系统上构建。

相关问题