2014-10-30 13 views
-2

: 나는 두 개의 매개 변수를 특정 유형의 이름에 대한 xstr와 매크로 함수를 정의 할 일은 그 코드를 원하는 것은단지 한 줄 조건부 검사 정의 코드를 촬영

typedef enum CHECKSUM { DENY = 0, ALLOW = 1 } checksum; 
#define terminal(x, str) static checksum* terminal_##x; { if(!strcmp(#str, "static")) { static checksum local = ALLOW; terminal_##x = &local; } else { checksum local = DENY; terminal_##x = &local; } } 

. 매크로 함수는 terminal_ 이름이 x과 연결되어 static checksum*을 선언합니다. 그런 다음 새로운 범위를 열고 특정 유형 str을 문자열로 바꾸고 과 같은지 확인하기 위해 strcmp을 사용합니다. 그렇다면 .. ALLOW으로 초기화 된 변수 유형 static checksum을 선언하고 선언 된 포인터가 그 포인터와 같지 않으면 변수 유형 checksum을 선언하고 DENY으로 초기화하고 포인터를 가리 키도록 설정합니다. 그런 다음 우리는 그와 같은 매크로 호출 할 수 있습니다

int main(void) 
{ 
    int i = 0; 

    while(*terminal_name == ALLOW) { terminal(name, static) if(i > 200) { *terminal_name = DENY; } i++; } 

    return 0; 
    // Note that this is only an example usage. The real usage of this is far more long and complicated. 
} 

코드가 잘 C89에 컴파일을하고는 오류 나 경고가 발생하지 않습니다. 첫 번째보기에서 .. 작동합니다. 하지만 너 혼자서 볼 수 있듯이. 정말 의심스러워 보입니다.

내가 올바른 방법을 사용하고 있습니까?

뭔가 이해하는 데 어려움이 있는지 물어보십시오.

답변

0

매크로가 합리적인 것이거나 프로그램에 대해 더 알지 못하는 나쁜 아이디어라고 말하기는 어렵습니다.

문법 상 백 슬래시를 사용하여 매크로를 여러 줄로 나눌 수 있습니다. 그러면 훨씬 더 읽기 쉽고 덜 의심 스럽습니다. static 여부를 정말 나에게 길을 잘못 티 나지 사용할지 여부를 결정하는 strcmp를 사용

#define terminal(x, str)     \ 
    static checksum* terminal_##x;   \ 
    {          \ 
     if (!strcmp(#str, "static")) {  \ 
      static checksum local = ALLOW; \ 
      terminal_##x = &local;   \ 
     }         \ 
     else {        \ 
      checksum local = DENY;   \ 
      terminal_##x = &local;   \ 
     }         \ 
    } 

. 이는 컴파일 타임 결정에 영향을주는 런타임 검사입니다. 매크로 인수를 키잉하는 대신 두 개의 개별 매크로를 작성하는 것이 좋습니다 (예 : LOCAL_TERMINALSTATIC_TERMINAL).

#define LOCAL_TERMINAL (x)  checksum terminal_##x = DENY 
#define STATIC_TERMINAL(x) static checksum terminal_##x = ALLOW 
+0

백 슬래시에 대해 저에게 상기시켜 주셔서 감사합니다. 그러나 이것이 좋은 생각인지 아닌지 묻지는 않습니다. 나는 그것에 대해 연구하고 있으며 심지어 여기에 게시하는 것이 중요하다고 생각합니다. 나는 C를 재발견하려하지 않고있다. – Genis

+0

이것이 효과가 있다고 말하면, 그것이 좋은 생각인지 아닌지 묻지 않는다. 당신의 질문은 무엇인가? 네가 무엇을 요구하는지 모르겠다. –

+0

한편 나는 몇 가지 검사를했다. 전역 적으로 작성 :'terminal (mouse, local)'다음으로 로컬에서 다음을 사용하여 검사 : if (terminal_mouse == ALLOW) .. 잘못된 메모리 영역에 대해 오류를 반환합니다. 제 질문이 여기 있습니다. 나는 이것을 원하지 않았다. 그래서 나는 잘못된 것을하고 있습니다. 편집 : 잠깐 만요. 나는 바보입니다. 그것은'static'이 반대이기 때문에 전역 적으로 선언해서는 안됩니다. – Genis