2011-03-06 2 views
3

C99에 라이브러리를 작성 중이며 매크로/인라인 함수를 사용하면 많은 이점을 얻을 수있는 라이브러리가 있습니다. 인라인 함수는 내 라이브러리에 더 적합합니다.어떻게 c99 라이브러리에서 인라인 함수를 사용하지만 노출하지 않습니까?

그러나 매우 구체적으로이 인라인 함수를 외부에 노출하고 싶지 않습니다.

모든 작업이 나타납니다,하지만 난 실행 파일을 생성하기 위해 라이브러리에 연결할 때 나는 오류 얻을 : 나는 정확히 수행하는 최소한의 테스트 케이스에 문제를 재현

"`na_impl_gfx__draw '에 정의되지 않은 참조를" 나는 무엇을 :

lib.h :

void somefunc(); 

lib.c :

#include <stdio.h> 
#include "lib.h" 

inline void someinline(char *value); 

void somefunc() { 
    someinline("Hi!"); 
} 

inline void someinline(char *value) { 
    printf("%s\n", value); 
} 
,

을 main.c :

#include "lib.h" 
int main(int argc, char *argv[]) { 
    somefunc(); 
} 

이제 우리는 컴파일 :

[email protected]:~/test$ gcc -c -std=c99 lib.c 
[email protected]:~/test$ gcc -c -std=c99 main.c 
[email protected]:~/test$ gcc -std=c99 lib.o main.o 
lib.o: In function `somefunc': 
lib.c:(.text+0xe): undefined reference to `someinline' 
lib.c:(.text+0x1a): undefined reference to `someinline' 
lib.c:(.text+0x26): undefined reference to `someinline' 
collect2: ld returned 1 exit status 

라이브러리를 컴파일 할 때, 인라인 함수는 함수 somefunc을위한 오브젝트 코드로 대체되지 않는 것으로 생각된다() lib.h에 있음

왜?

인라인 함수는 외부에서 볼 수 없습니다. 라이브러리가 컴파일 될 때 인라인 함수는 매크로처럼 (Nb.이 코드가 파일을 컴파일하는 매크로 만 사용하여) 인라인됩니다.

내가 뭘 잘못하고 있니? 아니면 인라인 함수의 제한입니까?

답변

5

동일한 소스 파일에서 인라인 함수를 볼 수없는 이유는 정적 파일로 만들지 않았기 때문입니다. 정적

inline static void someinline(char *value); 

와 함수 정의 :

당신이 할 필요가와 프로토 타입이 정적 만들 것입니다

inline static void someinline(char *value) { 
    printf("%s\n", value); 
} 
4

[죄송이 같은 최근의 발로를 들어, 태그해야 당신의 C99뿐만 아니라 C와 함께 질문.]

나는 당신이 완전히 잘못된 길에 있다고 생각한다. 인라인 함수는 ".h"파일에 넣을 때만 의미가 있습니다. 전체 개념은 모든 호출자가 함수 정의를 볼 수있게하는 것입니다.

이렇게하려면 헤더에 정의 (inline 포함)를 넣고 하나의 컴파일 단위에 외부 선언 (extern inline)을 넣어야합니다.

"lib.o"컴파일 유닛에 기능을 넣고 싶다면, inline 또는 static을 모두 잊어 버리고 컴파일러에서 대신 해주십시오.gcc 최적화를 켜면 :

`-finline-small-functions' Integrate functions into their callers when their body is smaller than expected function call code (so overall size of program gets smaller). The compiler heuristically decides which functions are simple enough to be worth integrating in this way.

Enabled at level `-O2'. 
+0

인라인은 c99까지 표준 기능이 아닙니다. 또한 이것은'정적 인라인 (static inline) '을위한 것이다. 비록 당신이 옳긴하지만 대부분의 컴파일러는 어쨌든이 함수를 인라인 할 수 있습니다. –