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.이 코드가 파일을 컴파일하는 매크로 만 사용하여) 인라인됩니다.
내가 뭘 잘못하고 있니? 아니면 인라인 함수의 제한입니까?
인라인은 c99까지 표준 기능이 아닙니다. 또한 이것은'정적 인라인 (static inline) '을위한 것이다. 비록 당신이 옳긴하지만 대부분의 컴파일러는 어쨌든이 함수를 인라인 할 수 있습니다. –