Код: Выделить всё
main.c
Код: Выделить всё
#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;
}
Код: Выделить всё
$ 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) \
|
Эти предупреждения никогда не появляются в реальном развернутом коде. Мой фрагмент расширяет их до строковых литералов, которые кажутся мне действительными. Я не понимаю, как это могло бы нарушить диалект C++.
Эти «ошибочные» идентификаторы такие же, как те, которые определены в libc (?).Обратите внимание, что я также использовал внутри тела макроса другие ключевые слова, специфичные для C++, такие как bool или nullptr, и предупреждение не указывает на них.
В любом случае, упомянутое поведение, похоже, не происходит с clang:
Код: Выделить всё
$ clang main.c -Wc++-compat
Код: Выделить всё
$ 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
Руководство 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