c++ - GCC 错误,当使用 "linux"尖括号通过宏包含 header 时,路径中的 "1"字符串替换为 "<>"

标签 c++ linux gcc compiler-errors

我可能在 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/

相关文章:

c - 强制对 C 函数进行编译时评估?

c++ - 将坐标舍入到列表中最接近的坐标

c++ - 多次更新同一个变量

linux - 使用sed命令执行脚本的查询

linux -/dev/random 权限被拒绝

c++ - 合理支持的最低 GCC 版本是多少?

c - 使用 gold vs ld 链接器时使用的 glibc/pthreads 的不同符号

c++ - X() = delete; 构造函数的区别和私有(private) X();

c++ - 编译gtkmm的问题

regex - 正则表达式(url.rewrite)