2016-08-30 2 views
0

내 C 코드에서 인라인 함수를 통해 정적 변수를 노출하고 표준 C에서 'extern'특성 인 OOP를 사용하지 마십시오. 그러나 컴파일 할 수 없습니다.인라인 함수를 통해 정적 변수 노출

[[email protected] snippets]$ cat object.h 
inline int get_value(int index); 
[[email protected] snippets]$ cat object.c 
#include "object.h" 
static int data_array[32]; 

inline int get_value(int index) { 
    return data_array[index]; 
} 
[[email protected] snippets]$ cat app.c 
#include "object.h" 
void main(void) { 
    int datum; 

    datum=get_value(8); 
} 
[[email protected] snippets]$ gcc -c object.c 
object.c:5:9: warning: ‘data_array’ is static but used in inline function ‘get_value’ which is not static 
    return data_array[index]; 
     ^
[[email protected] snippets]$ ls -l object.o 
-rw-rw-r-- 1 niko niko 976 Aug 30 15:56 object.o 
[[email protected] snippets]$ gcc -c app.c 
In file included from app.c:1:0: 
object.h:1:12: warning: inline function ‘get_value’ declared but never defined 
inline int get_value(int index); 
      ^
[[email protected] snippets]$ ls -l app.o 
-rw-rw-r-- 1 niko niko 1368 Aug 30 15:56 app.o 
[[email protected] snippets]$ gcc -o app app.o object.o 
app.o: In function `main': 
app.c:(.text+0xe): undefined reference to `get_value' 
collect2: error: ld returned 1 exit status 
[[email protected] snippets]$ 

, 즉이 모든 .c 인 파일에 인라인 될 것 그들이 인라인 함수를 통해 선언 된 파일 외부에서 어떻게 든 정적 변수를 액세스 할 수 있습니다 그것을 사용하고있는 다음 코드를 고려? 물론 난 그냥 변수 '통근'선언 할 수

extern int data_array[]; 

를하고 직접 참조하지만 함수 호출의 오버 헤드없이 C에서 OOP를 시뮬레이션 기능을 통해 그것을 할 싶어.

+4

C11 표준 초안의 n1570 : 여기에 모두 ISO C와 GNU C와 호환 일부 코드 *은 6.7.4 기능 지정자 3 수정의 정의를 포함하지 않는다 외부 링크와 함수의 인라인 정의 정적 또는 스레드 저장 기간을 가진 객체이며 내부 연결을 가진 식별자에 참조를 포함하지 않아야합니다. * – EOF

+0

@EOF too bad ... 인라인 함수를 통해 C에서 OOP를 어떻게 시뮬레이트합니까? 유일하게 실행 가능한 대안은 매크로 일 것입니다 ... – Nulik

+0

매크로가 어떻게 어떤 식 으로든 도움이 될지 모르겠습니다. 나는 왜 당신이 인라인 인 기능을 주장하는지 잘 모르겠다. – EOF

답변

2

코드가 올바르지 않습니다 (ISO C 및 GNU C 모두에서) : inline으로 선언 된 함수의 본문은 해당 함수를 호출 할 때와 동일한 번역 단위에 나타나야합니다. 그러나 코드에서 app.c에 나타나지 않으므로 정의되지 않은 참조 오류가 발생합니다.

또한 ISO C에서 inline 기능은 static이 아니며 내부 연결이있는 배열은 언급하지 않을 수도 있습니다. (나는이 영역에서 GNU C의 규칙이 무엇인지 모른다.).

댓글에서 "CALL 오버 헤드"등과 같은 내용에 대해 이야기합니다.하지만 inline 키워드와 관련이 거의 없거나 전혀 없습니다. 최적화 스위치를 사용하면 옵티마이 저가 가능한 가장 빠른 코드를 생성합니다. inline 키워드의 목적은 함수 본문을 헤더 파일에 표시하는 것입니다.

한 가지 옵션은 기능을 inline으로 표시 해제하고 gcc와 함께 -O2 -flto 스위치를 사용하는 것입니다.

또 다른 옵션은 inline 기능을 사용하지만 기능 본문을 헤더 파일에 넣는 것입니다. 이 경우 헤더 파일에 배열을 정의 할 수 없기 때문에 extern int data_array[]; 등을 사용해야합니다. 이 옵션을 사용하기 전에 read this page.

// header file 
extern int data_array[]; 

static inline int get_value(int index) 
{ 
    return data_array[index]; 
} 

// source file 
#include "header.h" 

int data_array[32]; 
+0

@AnT this 대답은 C입니다. ("C"를 여러 번 말하면서 "C++"이 아닙니다.) C11 6.7.4/7 "외부 링키지가있는 함수에 대해서는 다음과 같은 제한이 적용됩니다 : 함수가'inline' 함수 지정자로 선언된다면, 그것은 또한 같은 번역 단위로 정의되어야합니다." (6.2.3/5는'inline int get_value (int);'는 외부 링키지를 가진 함수를 선언한다). 내 대답에서 그 단락의 표현을 바꿨습니다. 함수 본문은 호출 이후이지만 같은 유닛 내에서 합법적입니다. –

+0

네, 맞습니다. 나는 다른 문제에 대해 생각하고 있었다. – AnT

+0

@AnT –

관련 문제