2016-10-23 8 views
0

#define 지시어에 정적 변수를 선언 할 수 있습니까? 내가 다른 파일에이 헤더 파일을 포함하고 액세스 Foo::TEXT[]하려고 할 때 컴파일러는 const 정적의 char *를 해결할 방법#define 지시문의 정적 변수

// header file 
    #define TEXT_ENUM 
    #ifdef TEXT_ENUM 
     #define TEXT_HANDLING_MACRO \ 
      static const char * TEXT[]; \ 
      static const char * getText(int _enum) { \ 
       return TEXT[_enum]; \ 
      } 
    #else 
     #define TEXT_HANDLING_MACRO 
    #endif 

    struct Foo { 
     TEXT_HANDLING_MACRO 
    }; 

    // cpp file 
    #include "foo.h" 

    const char * Foo::TEXT[] = { 
     "ONE", 
     "TWO", 
     "THREE", 
     0 
    }; 

.

+0

당신이'푸하셨습니까 :: 텍스트 []'? 그때 작동합니다. –

+0

'Packet :: TEXT '오류에 대한 정의되지 않은 참조를 얻습니다. – has

+2

@has : 즉, .cpp 파일이 없습니다. 위에서 제공 한 'Packet :: TEXT'는 완벽하게 정의되어 있습니다. – AnT

답변

1

#define 지시어에 정적 변수를 선언 할 수 있습니까?

예, 가능합니다.

이 헤더 파일을 다른 파일에 포함시키고 Foo::TEXT[]에 액세스하려고하면 컴파일러에서 static const char *를 어떻게 해결할 것입니까?

연결 단계에서 해결되었습니다.

+0

다른 파일에서 '#define TEXT_ENUM'을 정의하고이 'foo.h'파일에서 제거하면 다시 참조 오류가 발생합니다. 이 문제를 어떻게 해결할 수 있습니까? – has

+0

@has 아마도 다른 질문 일 것입니다. –

+0

ok 새로운 질문을 게시 할 예정입니다. 감사 – has

1

C 컴파일러가 사용하는 컴파일 단계를 통해 어떤 일이 발생하는지 파악해야합니다.

프리 컴파일러 지시문을 #define으로 설정 했으므로 실제로 코드를 컴파일하거나 살펴보기 전에 모든 사항이 해결됩니다. 텍스트 (코드, 함수, 포함 된 모든 요소)는 지시문에 따라 전달되거나 필터링됩니다.

모든 나머지는 컴파일과 마찬가지로 전역 변수 선언을 찾고 해당 변수의 주소를 찾을 링크입니다. 당신이 당신의 파일을하고 GCC 컴파일러와 -E 옵션을 사용하여 컴파일하는 경우

당신이 경우에, (단지 D 파일러 단계를 수행하는), 당신은 얻을 것이다 :

struct Foo { 
     static const char * TEXT[]; static const char * getText(int _enum) { return TEXT[_enum]; } 
    }; 

    const char * Foo::TEXT[] = { 
     "ONE", 
     "TWO", 
     "THREE", 
     0 
    };