У меня в настоящее время есть проект, который использует 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
Вы пробовали -Wmissing-декларации? Кажется, это работает для g ++ и обнаруживает описанный вами случай ошибки. Я не уверен, в какую версию они его добавили, но у меня он работает в 4.3.3.
-Wmissing-prototypes
неприменимо для C++, потому что C++ всегда требует прототипов.
Возьмем, например, следующее объявление:
void foo();
foo
может быть вызвано с любым количеством и типом аргументов. foo
не принимает никаких аргументов (ошибка компиляции, если переданы какие-либо аргументы). Когда вы компилируете файл с расширением .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++ всегда будет выдавать ошибку.