2016-07-01 2 views
0

finding-c++-static-initialization-order-problems, 헤더 파일에 매크로를 정의하고 싶습니다. "check_fiasco.h"를 작성한 다음,이 헤더 파일을 워렌 스티븐스 (Warren Stevens)의 아이디어처럼 모든 cpp 파일의 맨 위에 놓습니다. 그러나, 나는 리눅스에서 자신의 코드를 시도하고 작동하지 않는다. (컴파일되지만 실행될 때 충돌한다.) "/"함수 이름에 사용할 수 없습니다로 붙여 넣기 파일 이름으로,파일 이름이 매크로로 정의됩니다.

#define TOKENCONCAT(x, y) x ## y 
#define file_init_(x, y) TOKENCONCAT(x, y) 
#define FIASCO_FINDER_DEC \ 
    void file_init_(file_, __FILE__)(void) ((constructor)) ; 

#define FIASCO_FINDER_IMPL \ 
    void file_init_(file_, __FILE__)(void) __attribute__ {\ 
     printf("Good Morning, %s!\n", __FILE__);\ 
     return ;\ 
    } 

그러나이 작동하지 않습니다

나는 다음 매크로를 시도했다. 선언과 구현이 동일해야하므로 __COUNTER__을 사용할 수 없습니다.

아이디어가 있으십니까?

+0

이것은 C++ 문제이며 C와 관련이 없습니다. C 태그를 제거합니다. – Lundin

답변

0

실제 기호를 전역 기호로 사용할 필요가 없으므로이를 고유하게 만들 필요가 있습니다. 당신이 주장하는 경우, 당신은 컴파일러가 번역 단위마다 고유합니다 보장합니다 익명의 네임 스페이스로 전역 함수를 넣을 수 있습니다,

static void file_init_() ((constructor)) ; 

static void file_init_() 
{ 
    printf("Good Morning, %s!\n", __FILE__); 
} 

을 또는 : static 기호는 잘 작동합니다.

+0

더 자세히 설명 할 수 있습니까? 헤더가 어떻게 생겼는지, cpp 파일이 헤더를 사용하는 방법은 무엇입니까? 예를 들어 워렌 스티븐스 (Warren Stevens)의 생각을 시험해 보았지만 컴파일은되지만 플랫폼 (팔)을 사용하지는 않습니다. 지금까지 함수의 선언과 구현을 직접 cpp 파일에 넣었습니다. 하지만 내가 수십만 개의 파일을 가지고 있으므로 헤더 파일을 가지고 시험해 보았습니다. 그러나 작동하지 않았습니다 :-( – pepero

+0

당신이 정교 할 필요가있는 것이 전혀 없습니다. 이것은 컴파일 된 것이므로 매크로는 그냥 이것을 정의하십시오. –