2016-11-09 5 views
3

#ifdef가있는 C 헤더 파일 선언과 변수 및 함수 앞에 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

가능한 대용량의 [C++ Extern 함수] (http://stackoverflow.com/questions/11712707/extern-functions-in-c-vs-c) – Baldrick

+1

일반적으로 이와 같은 코드는 위험합니다. 즉, 두 섹션의 어딘가에는 '라이브러리 내부'와 '라이브러리 외부'의 일부 기능 사이에 중요한 차이가있을뿐입니다 (단순히 '외부'의 존재 또는 부재가 아님). 이는 '내부'코드가 '외부'코드 사용과 동일한 정의를 사용하므로 두 코드가 동기화된다는 것을 보장하기 때문에 문제가됩니다. 따라서 차이가있을 경우 컴파일러가 진단하지 못하는 문제가 발생할 수 있습니다. 선언은 프로토 타입이 아닙니다. 불특정 인수 목록 (생략 부호 없음)이있는 함수 일뿐입니다. –

답변

4

일부 호환되지 않거나 오래된 컴파일러에 대해서는 영향 또는 호환성 해킹입니다. extern 버전은 필요 없지만 함수 선언은 기본적으로 extern이므로이 함수를 사용하는 것이 좋습니다.

다른 말로하면, 그것은 벼룩이지만 어쩌면 누군가가 그 벼락이 필요합니다. 우리는 확실히 알 수 없습니다.