我可能在 gcc 中发现了一个错误。我在网上找不到与此相关的任何内容,所以我想知道以前是否有人看过。
我正在使用“Ubuntu 16.04.0 LTS”:
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.6)
, 但这个问题也可以在以后的 gcc 版本 gcc-6 和 gcc-7 上重现。
在这里https://github.com/mihaipop11/gcc-linux您可以找到包含所有来源的 github 存储库的链接,但我也会在下面进行解释。
如何重现:
我们有一个带有这些文件的漂亮小程序:
// main.cpp
#include <iostream>
#include INCLUDE_FILE
int main()
{
std::cout << "Works this time" << std::endl;
}
和文件夹中的头文件,假设名为 include
, 为空无关紧要,这仅用于演示目的。
// include.hpp
//empty header
整体结构如下:
<dir>
├── main.cpp
└── include
└── include.hpp
编译步骤:
我分析了两个案例,这个bug出现在第二个。
第一种情况:
<dir>
保存文件的文件夹名称应命名为任何名称,但不得包含字符串 linux
。 .例如:test-notlinux
整体结构如下:
test-notlinux
├── main.cpp
└── include
└── include.hpp
现在,cd test-notlinux
并尝试编译源代码:
g++ "-D INCLUDE_FILE=\"${PWD}/include/include.hpp\"" main.cpp
g++ "-D INCLUDE_FILE=<${PWD}/include/include.hpp>" main.cpp
结果: 两个命令都按预期工作。这里没问题。
第二种情况:
<dir>
保存文件的文件夹名称包含字符串 linux
.例如:test-linux
整体结构如下:
test-linux
├── main.cpp
└── include
└── include.hpp
现在,cd test-linux
并尝试编译源代码:
// first command should work
g++ "-D INCLUDE_FILE=\"${PWD}/include/include.hpp\"" main.cpp
// but this ...
g++ "-D INCLUDE_FILE=<${PWD}/include/include.hpp>" main.cpp
结果: 第二个命令显然取代了 linux
来自目录名称的字符串 1
输出: /tmp/test-1/include/include.hpp: No such file or directory
有人知道吗?
最佳答案
首先,linux
是一个定义为 1
的宏。在 <> 情况下宏被扩展,而在 ""情况下,标记是一个字符串。
第二件事是 linux
仅在使用 GNU 扩展时定义,因此只需使用 -std=c++{98,11,14,17,2a}
进行编译> 或 -ansi
并且它不会被定义(只有 __linux__
、__linux
和 __gnu_linux__
会被定义)。
关于c++ - GCC 错误,当使用 "linux"尖括号通过宏包含 header 时,路径中的 "1"字符串替换为 "<>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48802458/