stati c объявления функций в файлах заголовков - PullRequest
0 голосов
/ 10 июля 2020

У меня есть функция stati c в исходном файле, которая используется другими функциями в том же исходном файле. Можно ли поместить объявление для этой функции stati c в файл заголовка, даже если этот файл заголовка будет включен в другие исходные файлы? Пример:

/* foo.c */
#include "foo.h"
 
/* exported function; calls g */ 
void f(void) {
    g(); 
}

static 
void g(void) {
    /* do something... */
}

/* foo.h */ 
void f(void); 
void g(void);


/* main.c */ 
#include "foo.h"

int main(void) {
   f();
}

Ответы [ 2 ]

2 голосов
/ 10 июля 2020

Можно ли поместить объявление для этой функции stati c в файл заголовка, даже если этот файл заголовка будет включен в другие исходные файлы?

Нет. Рассмотрим конфликт, который возник бы в других исходных файлах, если бы в них была функция / объект / макрос с тем же именем.

Даже без конфликта может появиться предупреждение «неиспользуемая функция». @ Adrian Mole

Помещение static void g(void) в файл .h добавляет ненужный потенциальный конфликт имен.

Просто объявите / определите эту функцию c stati в верхней части. c, в которой она используется.

0 голосов
/ 10 июля 2020

Можно ли поместить объявление для этой функции stati c в файл заголовка, даже если этот файл заголовка будет включен в другие исходные файлы?

Нет. потому что это не имеет никакого смысла. и почему? В C функции по умолчанию - global. В отличие от global functions в C, доступ к static functions ограничен файлом, в котором они объявлены! Поэтому, когда мы хотим restrict access для функций, мы делаем их stati c.

Другой причиной для создания функций c может быть повторное использование того же имени функции в других файлах. поэтому объявление их stati c в файле заголовка может вызвать коллизии имен в других исходных файлах.

В файлах заголовков мы объявляем наши функции API, которые мы хотим предоставить только. в файлах c мы обычно объявляем вспомогательные функции как stati c функции для ограничения объема этих вспомогательных функций только файлом c

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