2014-10-13 2 views
0

일부 악마 매크로를 사용하여 파일의 모든 함수에 대한 포인터 배열을 생성하고 싶습니다. 불행히도 저는 C99로 제한되어 있고별로 인기가없는 컴파일러가 아닙니다.함수 포인터의 전역 배열 초기화

나는 아이디어를 가지고 있지만 안전 있는지 확실하지 않습니다 :

void foo(void) 
{ 
    ;  
} 

void bar(void) 
{ 
    ; 
} 

typedef void (*FuncPointer)(void); 

FuncPointer array[2] = {foo, bar}; 

내가 그것을 시도하고 컴파일, 심지어 일을하지만, C에 그 사실 이런 종류의 일이라고 MEEN하지 않습니다 안전하거나 휴대 가능합니다.

포인터의 전역 배열 초기화에 대한 보증이 있습니까?

+3

"안전한"의미는 무엇입니까? 아무 의미 없어? 그것을 정의 하시겠습니까? –

+0

물론 보장이 있습니다 : 초기화하면 초기화됩니다. 당신의 이식성 문제는 무엇입니까? 그리고 매크로에서 파일의 모든 함수 이름을 수집하는 것은 불가능하다고 확신합니다. – mafso

+0

@KerrekSB "safe"에 의해 "포인터가 유효 함"을 의미했습니다. – Amomum

답변

1

예, 이는 표준에서 작동하는 것이 보장됩니다. 모든 배열은 main이 호출되기 전에 채워집니다.

또한이는 전역 생성자가 호출되기 전에 C++ 또는 (GNU C에서 예를 들어 __attribute__((constructor))) C 글로벌 생성자를 지원하는 컴파일러 관련 확장

유일한 케이스를 사용하는 경우, 완료 될 보장 자신 만의 커널을 작성하는 경우 걱정할 필요가 있습니다.이 경우 실행 파일의 모든 부분을로드해야합니다.

+0

모든 함수 및 배열을 정적으로 선언하면 변경 될까요? – Amomum