当前位置: 首页 > 知识库问答 >
问题:

GCC Bug,当使用“”尖括号包含通过宏的头时,路径中的“Linux”字符串被替换为“1”

谭刚毅
2023-03-14

我可能在GCC中发现了一个bug。我在网上找不到任何与此相关的东西,所以我想知道是否有人以前见过这个。

我使用的“Ubuntu 16.04.0 LTS”是:gcc version 5.4.0 201 60609(Ubuntu 5.4.0-6Ubuntu1~16.04.6),但是这个问题也会在更高的gcc版本gcc-6和GCC-7上出现。

在https://github.com/mihaipop11/gcc-linux中,您可以找到一个链接,链接到包含所有源代码的github repo。

如何繁殖:

我们有一个很好的小程序,里面有这些文件:

// 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

总体结构如下所示:

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

结果:两个命令都按预期工作。这里没有问题。

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

结果:第二个命令显然用1替换了dir名称中的Linux字符串

输出:/tmp/test-1/include/include.hpp:没有这样的文件或目录

有人对此有所了解吗?

共有1个答案

魏勇军
2023-03-14

首先,Linux是定义到1的宏。在<>的情况下,宏被展开,而在“”的情况下,令牌是一个字符串。

其次,Linux仅在使用GNU扩展时才被定义,所以只要使用-std=c++{98,11,14,17,2a}-ANSI编译,就不会被定义(只有__linux___linux__gnu_linux__被定义)。

 类似资料:
  • 我可能在GCC中发现了一个bug。我在网上找不到任何与此相关的东西,所以我想知道有没有人以前见过这个。 我正在使用“Ubuntu 16.04.0 LTS”和:,但是这个问题也可以在以后的gcc版本gcc-6和GCC-7上重现。 在https://github.com/mihaipop11/gcc-linux中,您可以找到包含所有源代码的github repo的链接,但我也将在下面解释这一点。 如何

  • 问题内容: 我有一个包含标记的字符串列表。 令牌是: {ARG:token_name}。 我也有标记的哈希图,其中key是标记,value是我要用来替换标记的值。 当我使用“ replaceAll”方法时,出现错误: java.util.regex.PatternSyntaxException:非法重复 我的代码是这样的: 并且valueFromHashMap包含{和}。 我将此哈希图作为参数。

  • 如何删除字符串中任意位置的圆括号?

  • 两行的一个例子是:([a,b,c],d)和([d,e],a)我想把这些行转换成([a,b,c],[d,e])和([d,e],[a,b,c]) dataframe的列名是“src”和“dst”。 我如何处理这个问题?

  • 本文向大家介绍使用JS正则表达式 替换括号,尖括号等,包括了使用JS正则表达式 替换括号,尖括号等的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇使用JS正则表达式 替换括号,尖括号等就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 然后我试着这样称呼它。 不幸的是,修改URL编码路径替换后,我最终请求而不是。是否有任何方法可以禁用路径替换的URL编码或跨多个路径段进行替换?不幸的是,我甚至不知道有多少路径段,它都是由API控制的。