Почему опция gcc "-Wstrict-prototypes" недопустима для C ++? - PullRequest
6 голосов
/ 15 июля 2011

Вот предупреждение, которое я и многие другие люди в сети видим, когда запускаю gcc на C ++ коде:

cc1plus: warning: command line option "-Wstrict-prototypes" is valid for Ada/C/ObjC but not for C++

Текст предупреждения очень ясен: «C ++» отсутствует в наборе [Ada / C / ObjC], поэтому у меня нет никаких сомнений относительно того, почему gcc выдает это предупреждение при компиляции кода C ++. (К вашему сведению, причина, по которой мы включили этот флаг, несмотря на наличие кода C ++, заключается в том, что в основном это код C, мы выбрали строгий (высокий уровень) список параметров предупреждений, но мы добавили немного кода C ++.

Мой вопрос: почему это предупреждение не подходит для C ++?

Документация gcc для опции предупреждения от http://gcc.gnu.org/onlinedocs/gcc-4.4.2/gcc/Warning-Options.html,:

-Wstrict-prototypes (только C и Objective-C) Предупредить, если функция объявлена ​​или определена без указания типов аргументов. (An определение функции старого стиля разрешается без предупреждения, если предшествует объявление, которое определяет типы аргументов.)

Теперь я просто знаю Я забыл кое-что очевидное о C ++, но разве C ++ также не требует указания типов аргументов для функций в прототипе? Правда ли, что эти прототипы функций часто находятся в объявлениях классов, потому что функции часто являются функциями-членами, но, тем не менее, не нужны ли прототипы? Или даже если это просто хорошая практика, то почему бы gcc не предложить поддержку с помощью этой опции? Или, если нет, по параллельной опции для C ++?

Ответы [ 4 ]

9 голосов
/ 15 июля 2011

Полагаю, это потому, что C ++ требует строгих прототипов как части языка, поэтому эта опция лишняя. Почему это заставляет GCC жаловаться на это, я не в себе.

У меня установлен этот параметр в моем скрипте сборки для небольших примеров / тестовых программ на Си или Си ++, и меня раздражает предупреждение - кажется, что нет причины предупреждать только потому, что поведение по умолчанию для языка - это то, что я Я прошу. Но он есть, поэтому однажды, когда меня это достаточно раздражит, я исправлю свой сценарий, чтобы не беспокоиться об этой опции для сборок C ++.

3 голосов
/ 15 июля 2011

Это требуется стандартом C ++, поэтому нет смысла включать или выключать его: на языке всегда включено .

3 голосов
/ 15 июля 2011

Это неявно в C ++, потому что объявление / определение функции без указания типов аргументов является недопустимым стандартом C ++ (да, это одно из отличий между C и C ++, которое делает C ++ не настоящим надмножеством).

Это допустимый C99, но не допустимый C ++ 03:

void foo(x, y)
    int x;
    char *y;
{
    // ...
}

GCC выдает предупреждение об этом в C, если компилируется с -Wstrict-prototypes.

0 голосов
/ 22 августа 2017

Еще один интересный особый случай:

extern int foo(); 

По семантике C это объявление указывает неполный тип для foo, где число и тип аргументов остаются неопределенными.Это полностью разрешено C99 / C11, но -Wstrict-prototypes выдает предупреждение для этого объявления в C.

В соответствии с семантикой C ++ это объявление определяет тип complete для foo, какфункция, которая не принимает аргументов (т.е. она эквивалентна extern int foo(void)).Следовательно, -Wstrict-prototypes не относится к этому случаю в C ++.

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