Использование неявного объявления для сокрытия вспомогательных функций - PullRequest
0 голосов
/ 20 января 2019

Как указано здесь C делает неявное объявление функций, которые он не знает. Поэтому я склонен использовать его для сокрытия деталей реализации. Я определил следующий заголовочный файл:

#ifndef TEST_H
#define TEST_H

#define PRINT(msg) \
    do{\
        _print_info_msg(msg);\
        printf(msg);\
    } while(0)

#endif //TEST_H

и соответствующий файл C:

#include "test.h"

void _print_info_msg(const char *str){
    printf("INFO: printing %s\n", str);
}

При компиляции этого кода компилятор предупреждает, что implicit declaration of function ‘_print_info_msg’ [-Wimplicit-function-declaration].

Преимущество, которое я вижу, состоит в том, что мы не предоставляем напрямую вспомогательную функцию (_print_info_msg) напрямую тем, кто включает test.h, но мы используем компоновщик, поэтому обеспечивается реализация _print_info_msg.

Я не уверен в этом подходе ... Он вообще имеет смысл? Для меня это выглядит некрасиво, но это единственный «вариант использования», который я смог найти для неявного объявления.

1 Ответ

0 голосов
/ 20 января 2019

TL; DR: Вы оставляете себя открытым для ошибок, и на самом деле ничего не скрываете.

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

Не используйте его!Это предупреждение компилятора предназначено исключительно для того, чтобы не сломать старые базы кода, но это должно быть ошибкой.И на самом деле является ошибкой, когда требуется самый строгий режим соответствия от чьего-либо компилятора.

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

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

О, и идентификаторы с начальным подчеркиванием в файлеОбласть действия зарезервированы для реализации (ваша цепочка инструментов).Это означает, что у вас не может быть идентификатора области файла с начальным подчеркиванием, для риска носовых демонов.Лучше переименуй _print_info_msg.

...