2016-11-09 2 views
3

Я знаю объявление заголовков 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() 
    { 
    /* ... */ 
    } 

/* ... */ 

Так вот я и немного запутался. В чем причина объявления всех функций дважды в заголовке таким образом?

+0

Хмм .. это интересно .... IIRC, функции являются внешними связями, по умолчанию. –

+2

Возможный дубликат [Extern functions in C vs C++] (http://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c) – Baldrick

+1

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

ответ

4

Это либо аффект, либо взлом совместимости для какого-то несоответствующего или древнего компилятора. Вам не нужна версия extern, но ее использование также прекрасное, потому что объявления функций по умолчанию являются внешними.

Другими словами, это круто, но, возможно, кому-то нужен этот рывок. Мы не можем точно знать.

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