Я знаю объявление заголовков C с #ifdef и значением extern перед переменными и функциями. Но в последнее время у меня сторонняя библиотека для встроенного устройства со следующей схемой:Функция, объявленная дважды в файле заголовка C
/* "lib.h" */
#ifndef LIB_H_
#define LIB_H_
#ifdef LIB_C
void function1();
/* ... */
#else
extern void function1();
/* ... */
#endif
#endif /* LIB_H_ */
И кроме того, я получил соответствующий исходный C файл:
/* lib.c */
#define LIB_C
#include "lib.h"
void function1()
{
/* ... */
}
/* ... */
Так вот я и немного запутался. В чем причина объявления всех функций дважды в заголовке таким образом?
Хмм .. это интересно .... IIRC, функции являются внешними связями, по умолчанию. –
Возможный дубликат [Extern functions in C vs C++] (http://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c) – Baldrick
В общем, такой код опасен. Это означает, что где-то в двух разделах есть, вероятно, значительная разница (а не просто наличие или отсутствие «extern») между некоторыми функциями для «внутри библиотеки» и «вне библиотеки». Это проблема, потому что наличие кода «внутри» использует те же определения, что и «внешний» код, гарантирует, что эти два синхронизированы, поэтому, если есть разница, может возникнуть проблема, которую компилятор не будет диагностировать. Обратите внимание: декларация не является прототипом; это просто функция с неопределенным списком аргументов (но не многоточие). –