Как проверить правильность заголовочного файла на языке программирования C - PullRequest
2 голосов
/ 22 августа 2011

Есть ли способ на языке программирования C проверить, соответствуют ли прототипы функций из заголовочных файлов фактическому определению функции во время компиляции.Например, если я создал файл заголовка, а затем изменил подпись какой-либо функции, описанной в этом файле заголовка, могу ли я проверить во время компиляции, есть ли неправильный прототип в файле заголовка?Это работа компилятора или другого инструмента перед компиляцией?Спасибо.

Ответы [ 3 ]

2 голосов
/ 22 августа 2011

Если вы объявляете одно и то же имя функции с двумя разными прототипами, компилятор должен это отловить, т.е.:

int foo(int a, int b);

...

int fee(int a, int b) { ... }

Если, конечно, вы не попытаетесь позвонить foo из другого места.Тогда компоновщик будет жаловаться.

1 голос
/ 22 августа 2011

Это работа компилятора, и, по моему опыту, она делает это довольно хорошо :)

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

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

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

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

Последнее решениебудет использовать библиотеки clang для написания собственных программ проверки кода.

...