Почему LLVM жалуется на отсутствие прототипов функций? - PullRequest
3 голосов
/ 28 сентября 2011

LLVM 2.1 имеет опцию, которая включает предупреждения для «отсутствующих прототипов функций». Когда включено, предупреждение будет жаловаться на файл как этот:

double square( double d )
{
    return d*d;
}
void main()
{
    // ...
}

Функция "квадрат" вызовет предупреждение, потому что оно определено без объявления (прототипа). Вы можете устранить предупреждение следующим образом:

double square( double d );
double square( double d )
{
    return d*d;
}
void main()
{
    // ...
}

Я программировал на C ++ двадцать лет и никогда не видел такого предупреждения. Мне это не кажется полезным.

По умолчанию это предупреждение включено в новых проектах консоли Mac (по крайней мере) в Xcode 4.1. Очевидно, кто-то нашел это достаточно полезным, чтобы сначала реализовать его, а затем включить по умолчанию.

Почему это полезное предупреждение? Почему LLVM имеет это в качестве опции? Почему опция включена по умолчанию на XCode?

Ответы [ 3 ]

8 голосов
/ 28 сентября 2011

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

Хотя без такого предупреждения вы получите ошибки при линковке.Кто-то может спросить себя, в чем же заключается проблема (количество причин ошибок).

Предупреждение на этапе компиляции является гораздо лучшим признаком ошибки, чем ошибка компоновки.

2 голосов
/ 28 сентября 2011

Если это может быть полезно, чтобы убедиться, что каждая функция является видимой из какого-либо заголовка или статической.

У меня были случаи, когда два файла были связаны вместе, даже если ни один из них не использовал один и тот же файл заголовка.

Возьмите этот пример:

int test()
{
    return 0;
}

Если заголовка нет, у вас может быть второй файл, который будет:

extern int test();
test();

Если вы пишете библиотеку, это предупреждениеможет сказать вам, что кто-то может использовать эту функцию, даже если он не должен был, так как эта функция не в заголовке.Они должны были быть помечены как статические.

0 голосов
/ 16 декабря 2012

Прототипом «int test ()» должно быть «int test ( void )», тогда все в порядке.

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