gpt4 book ai didi

c++ - 考虑到危险,为什么项目使用 -I include 开关?

转载 作者:IT老高 更新时间:2023-10-28 12:38:32 27 4
gpt4 key购买 nike

阅读 -I 的细则在 GCC 中切换,我很震惊地发现在命令行上使用它会覆盖系统包括。来自 preprocessor docs

"You can use -I to override a system header file, substituting your own version, since these directories are searched before the standard system header file directories."

他们似乎没有撒谎。在具有 GCC 7 的两个不同 Ubuntu 系统上,如果我创建文件 endian.h :

#error "This endian.h shouldn't be included"

...然后在同一目录中创建 main.cpp (或main.c,相同的区别):

#include <stdlib.h>
int main() {}

然后用 g++ main.cpp -I. -o main 编译(或clang,相同的区别)给了我:

In file included from /usr/include/x86_64-linux-gnu/sys/types.h:194:0,
from /usr/include/stdlib.h:394,
from /usr/include/c++/7/cstdlib:75,
from /usr/include/c++/7/stdlib.h:36,
from main.cpp:1:
./endian.h:1:2: error: #error "This endian.h shouldn't be included"

所以 stdlib.h 包含这个 types.h 文件,它在第 194 行只是说 #include <endian.h> .我明显的误解(也许是其他人的误解)是尖括号可以防止这种情况发生,但是 -I 比我想象的要强大。

虽然不够强足够,因为你甚至无法通过在命令行中粘贴/usr/include 来修复它,因为:

"If a standard system include directory, or a directory specified with -isystem, is also specified with -I, the -I option is ignored. The directory is still searched but as a system directory at its normal position in the system include chain."

确实,g++ -v main.cpp -I/usr/include -I. -o main 的详细输出将/usr/include 留在列表底部:

#include "..." search starts here:
#include <...> search starts here:
.
/usr/include/c++/7
/usr/include/x86_64-linux-gnu/c++/7
/usr/include/c++/7/backward
/usr/lib/gcc/x86_64-linux-gnu/7/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include

让我感到惊讶。我想这是一个问题:

大多数项目使用 -I 的正当理由是什么?考虑到这个极其严重的问题? 您可以根据偶然的名称冲突覆盖系统上的任意 header 。几乎每个人都不应该使用-iquote代替?

最佳答案

-I 有什么正当理由?超过 -iquote ? -I是标准化的(至少由 POSIX ),而 -iquote不是。 (实际上,我使用的是 -I,因为 tinycc(我希望我的项目编译的编译器之一)不支持 -iquote。)

如何使用 -I 管理项目考虑到危险?您将包含包含在一个目录中并使用 -I 添加包含该目录的目录。

  • 文件系统:includes/mylib/endian.h
  • 命令行:-Iincludes
  • C/C++ 文件:#include "mylib/endian.h" //or <mylib/endian.h>

这样,只要您不与 mylib 发生冲突即可名称,你不会冲突(至少就标题名称而言)。

关于c++ - 考虑到危险,为什么项目使用 -I include 开关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53154898/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com