Как я могу получить пропущенные предупреждения прототипа от g ++? - PullRequest
7 голосов
/ 05 марта 2010

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

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) Есть ли способ включить это предупреждение?

EDIT:

Вот пример вырезания и вставки:

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

Ответы [ 3 ]

10 голосов
/ 05 марта 2010

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

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

P.S. В качестве примечания: Понятие prototype относится только к языку C. В C ++ нет «прототипов».

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

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

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

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

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

7 голосов
/ 05 марта 2010

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

Например, возьмем следующую декларацию:

void foo();
  • В C * foo canвызываться с любым числом и типом аргументов.
  • В C ++ foo не принимает никаких аргументов (ошибка компиляции, если переданы какие-либо аргументы).
3 голосов
/ 03 августа 2010

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

...