Ошибка GCC, строка "linux" в пути заменена на "1" при использовании угловых скобок ">> для включения заголовка через макрос

Возможно, я нашел ошибку в 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

Шаг компиляции:

Я проанализировал два случая, и ошибка появляется во втором.

Первый случай:

<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 строка из имени dir с 1

Выход: /tmp/test-1/include/include.hpp: No such file or directory

Кто-нибудь знает что-нибудь об этом?

1 ответ

Решение

Первое, что linux это макрос, определенный для 1, В случае <> макрос раскрывается, а в случае "" токен является строкой.

Второе, что linux определяется только при использовании расширений GNU, поэтому просто скомпилируйте -std=c++{98,11,14,17,2a} или же -ansi и это не будет определено (только __linux__, __linux а также __gnu_linux__ будет).

Другие вопросы по тегам