Как я получаю недостающие опытные предупреждения от g ++?

У меня в настоящее время есть проект, который использует g ++ для компиляции, это - код. Я нахожусь в процессе чистки кода, и я хотел бы удостовериться, чтобы все функции имели прототипы, чтобы гарантировать, что вещи как символ константы * правильно обрабатываются. К сожалению, g ++ жалуется, когда я пытаюсь указать - Wmissing-прототипы:

g++ -Wmissing-prototypes -Wall -Werror -c foo.cpp
cc1plus: warning: command line option "-Wmissing-prototypes" is valid for Ada/C/ObjC but not for C++

Может кто-то говорить мне:
1) Почему делает gcc, это не допустимо? Действительно ли это - ошибка в gcc?
2) Существует ли способ включить это предупреждение?

Править:

Вот вырезанный и вставленный пример:

cat > foo.cpp <<EOF
void myfunc(int arg1, int arg2)
{
    /* do stuff with arg1, arg2 */
}
EOF
g++ -Wmissing-prototypes -c foo.cpp  # complains about not valid
g++ -c foo.cpp                       # no warnings
# Compile in C mode, warning appears as expected:
g++ -x c -Wmissing-prototypes -c foo.cpp
7
задан Roman C 20 March 2016 в 08:02
поделиться

3 ответа

Вы пробовали -Wmissing-декларации? Кажется, это работает для g ++ и обнаруживает описанный вами случай ошибки. Я не уверен, в какую версию они его добавили, но у меня он работает в 4.3.3.

3
ответ дан 6 December 2019 в 08:42
поделиться

-Wmissing-prototypes неприменимо для C++, потому что C++ всегда требует прототипов.

Возьмем, например, следующее объявление:

void foo();
  • В C, foo может быть вызвано с любым количеством и типом аргументов.
  • В C++, foo не принимает никаких аргументов (ошибка компиляции, если переданы какие-либо аргументы).
7
ответ дан 6 December 2019 в 08:42
поделиться

Когда вы компилируете файл с расширением .cpp, он по умолчанию компилируется как C++ код. В языке C++ требование объявления функций является обязательным, жестким требованием. Нет смысла делать опцию -Wmissing-prototypes для C++.

Другими словами, вы не можете "включить это предупреждение" в C++, потому что "отсутствующий прототип" всегда является ошибкой в C++.

P.S. В качестве примечания: понятие прототипа характерно только для языка Си. В C++ нет никаких "прототипов".

В языке Си объявление функции может быть прототипом или не быть прототипом, отсюда и необходимость в дополнительном термине для отличия одних от других. В C++ объявления функций - это всегда "прототипы" (с точки зрения языка Си), поэтому в C++ просто нет необходимости в этом дополнительном термине. В C++ объявления функций - это просто объявления функций. Этим все сказано.

EDIT: Прочитав ваш комментарий, я пришел к выводу, что вы, должно быть, неправильно поняли смысл и назначение опции -Wmissing-prototypes и соответствующего предупреждения. Обратите внимание, что эта опция не проверяет, включили ли вы прототипы всех ваших функций в какой-либо заголовочный файл. В GCC нет такой опции, независимо от того, используете ли вы C или C++.

Назначение -Wmissing-prototypes другое. Эта опция работает только тогда, когда вы вызываете функцию, у которой нет видимого прототипа в момент вызова. В языке Си это законно, но если вы хотите получить предупреждение в этом случае, то используйте опцию -Wmissing-prototypes. В языке C++ вызов функции, не имеющей видимого объявления ("прототипа") в момент вызова, всегда является немедленной ошибкой, поэтому компиляторам C++ не нужна такая опция, как -Wmissing-prototypes.

Другими словами, если вы определили какую-то функцию в каком-то файле реализации, но забыли включить прототип этой функции в какой-то заголовочный файл, вы не получите никаких предупреждений от компилятора, пока не попытаетесь вызвать эту функцию. Неважно, на каком языке написан ваш код - C или C++, используете ли вы -Wmissing-prototypes или нет... Пока вы не попытаетесь вызвать функцию, никаких предупреждений не будет.

Но как только вы попытаетесь вызвать функцию без прототипа, компилятор C выдаст предупреждение (если вы использовали -Wmissing-prototypes), а компилятор C++ всегда будет выдавать ошибку.

11
ответ дан 6 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: