Является ли предупреждение -Wc++-compat об идентификаторах, еще не расширенных макросом, ложным срабатыванием?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Является ли предупреждение -Wc++-compat об идентификаторах, еще не расширенных макросом, ложным срабатыванием?

Сообщение Anonymous »

Я компилировал свой код C с учетом некоторых очень «нестандартных» предупреждений и обнаружил потенциальную ошибку GCC — ложное срабатывание, вызванное -Wc++-compat. Прежде чем что-либо объяснять, вероятно, было бы проще сначала представить код:

Код: Выделить всё

#include 

#define X_KEYWORDS  \
X(bool)     \
X(not)      \
X(and)      \
X(or)       \
X(xor)      \
X(nullptr)  \
X(true)     \
X(false)

int main(void)
{
#       define X(keyword) puts(#keyword);
X_KEYWORDS
#       undef X
return 0;
}
А при компиляции с использованием -Wc++-compat GCC выводит следующую диагностику:

Код: Выделить всё

$ gcc main.c -Wc++-compat
main.c:5:11: warning: identifier "not" is a special operator name in C++ [-Wc++-compat]
5 |         X(not)      \
|           ^
main.c:6:11: warning: identifier "and" is a special operator name in C++ [-Wc++-compat]
6 |         X(and)      \
|           ^
main.c:7:11: warning: identifier "or" is a special operator name in C++ [-Wc++-compat]
7 |         X(or)       \
|           ^
main.c:8:11: warning: identifier "xor" is a special operator name in C++ [-Wc++-compat]
8 |         X(xor)      \
|
Как видите, он предупреждает меня о конструкциях внутри определения макроса; они еще нигде не были расширены. Тело main здесь не имеет значения; он может быть даже пустым — int main(void) { — и в любом случае будут появляться те же предупреждения. Я просто хотел показать, что этот конкретный X-макрос имеет допустимый вариант использования.
Эти предупреждения никогда не появляются в реальном развернутом коде. Мой фрагмент расширяет их до строковых литералов, которые кажутся мне действительными. Я не понимаю, как это могло бы нарушить диалект C++.
Эти «ошибочные» идентификаторы такие же, как те, которые определены в libc (?).Обратите внимание, что я также использовал внутри тела макроса другие ключевые слова, специфичные для C++, такие как bool или nullptr, и предупреждение не указывает на них.
В любом случае, упомянутое поведение, похоже, не происходит с clang:

Код: Выделить всё

$ clang main.c -Wc++-compat
и отлично компилируется как C++ всеми доступными на данный момент компиляторами:

Код: Выделить всё

$ mv main.c main.cpp
$ g++ main.cpp
$ cl main.cpp /nologo
main.cpp
$ clang++ main.cpp
  • Могу ли я с уверенностью предположить, что это ошибка, специфичная для GCC?
    Или есть ли случай, когда эта диагностика будет действительна?
  • Почему она предупреждает только о вещах из ?
(ссылки)

Код: Выделить всё

$ uname -a
Linux MAL200424 6.11.6-arch1-1 #1 SMP PREEMPT_DYNAMIC Fri, 01 Nov 2024 03:30:41 +0000 x86_64 GNU/Linux

$ gcc --version
gcc (GCC) 14.2.1 20240910

$ clang --version
clang version 18.1.8
Ссылка на godbolt: https://godbolt.org/z/8jo363EbP

Руководство GCC: https://gcc.gnu.org/onlinedocs/gcc- 14.2.0/gcc/Warning-Options.html#index-Wc_002b_002b-compat

о : https://en.cppreference.com/w/c/languag ... lternative

Подробнее здесь: https://stackoverflow.com/questions/791 ... by-macro-a
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»