2016-07-18 3 views
1

В настоящее время я практикую единичный тест с GTest и заметил, что я не объявлял все функции, записанные в целевом исходном коде (target.c), в его заголовок (target.h). Поскольку я не тестировал эти незаявленные функции, я не мог заметить до сих пор.Что произойдет, если я не объявлю все функции в заголовке?

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

Могу ли я считать это способом объявления частной функции или я должен знать о чем-то еще для безопасности?

+1

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

ответ

2

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

static void myfunc() 
{ 
... 
} 

не включая его в заголовке не делает его собственная функция, так как любой другой файл C может добавить extern void myfunc() либо их заголовка или C код и получить доступ к этой функции. Во время компиляции все это будет связано (при условии, что вы компилируете все файлы).

НО все статические объекты будут иметь только уровень модуля (или файл области видимости) видимости

То же самое касается переменных, которые вы хотите только в filescope.

+1

Но вы никогда не должны писать объявление функции extern в исходном файле; они должны появляться только в заголовках. Все остальное - кошмар для обслуживания. –

Смежные вопросы