Включить предупреждение компилятора при использовании двойного подчеркивания - PullRequest
0 голосов
/ 05 ноября 2018

Давайте предположим следующий код

int __foo(void) {
    return 0;
}

int _BAR(void) {
    return 3;
}

int main(void) {
    return __foo() & _BAR();
}

Двойное подчеркивание и одно подчеркивание, за которым следуют символы верхнего регистра, зарезервированы и, следовательно, недопустимы ( Это вопрос C ++, но в нем также упоминаются правила C ).

Я попробовал -Wall -Wextra -pedantic опции на gcc и -Weverything опции на clang, оба не предупреждают об этом.

Есть ли способ включить предупреждение компилятора для этого?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

GCC и Clang, по-видимому, не предлагают такую ​​функцию.

Документация для предупреждающих сообщений GCC: здесь (для версии 8.2; для поиска документации для других версий запустите здесь ). Никто из них не упоминает о проверке зарезервированных идентификаторов или идентификаторов, которые начинаются со знака подчеркивания, за которым следует знак подчеркивания или заглавная буква, за исключением некоторых особых случаев (например, встроенного __FILE__), которые бесполезны для этого вопроса.

Документация Clang здесь (это ссылка на текущую версию, поэтому ожидается, что она будет обновлена ​​в будущем). Он также не упоминает о проверке зарезервированных идентификаторов.

В Clang, -Weverything включает всю диагностику, поэтому, если при компиляции кода образца с -Weverything диагностика не появляется, требуемая диагностика в Clang не реализована.

Похоже, нет никаких причин, по которым компилятор не может этого сделать. Clang отслеживает источник исходного текста. Например, если расширение макроса приводит к синтаксической ошибке, Clang печатает несколько диагностических строк, показывая имена, номера строк и имена файлов соответствующих макросов. Кроме того, Clang подавляет предупреждения в системных заголовках, и ему можно указывать обрабатывать дополнительные файлы (например, заголовки для библиотек) аналогично #pragma clang system_header. Таким образом, представляется возможным, чтобы Clang выдал предупреждение для любого зарезервированного идентификатора, который не исходит из системного заголовка. Отсутствие такой функции может быть связано с отсутствием спроса.

0 голосов
/ 05 ноября 2018

Компилятор практически не может предупредить вас об этом. Как только препроцессор включает в себя любые стандартные библиотечные файлы (которые, конечно, могут содержать двойные подчеркивания), компилятор действительно не знает происхождение такого кода.

Хорошая IDE или статический анализатор может предупредить вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...