: 나는 두 개의 매개 변수를 특정 유형의 이름에 대한 x
과 str
와 매크로 함수를 정의 할 일은 그 코드를 원하는 것은단지 한 줄 조건부 검사 정의 코드를 촬영
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에 컴파일을하고는 오류 나 경고가 발생하지 않습니다. 첫 번째보기에서 .. 작동합니다. 하지만 너 혼자서 볼 수 있듯이. 정말 의심스러워 보입니다.
내가 올바른 방법을 사용하고 있습니까?
뭔가 이해하는 데 어려움이 있는지 물어보십시오.
백 슬래시에 대해 저에게 상기시켜 주셔서 감사합니다. 그러나 이것이 좋은 생각인지 아닌지 묻지는 않습니다. 나는 그것에 대해 연구하고 있으며 심지어 여기에 게시하는 것이 중요하다고 생각합니다. 나는 C를 재발견하려하지 않고있다. – Genis
이것이 효과가 있다고 말하면, 그것이 좋은 생각인지 아닌지 묻지 않는다. 당신의 질문은 무엇인가? 네가 무엇을 요구하는지 모르겠다. –
한편 나는 몇 가지 검사를했다. 전역 적으로 작성 :'terminal (mouse, local)'다음으로 로컬에서 다음을 사용하여 검사 : if (terminal_mouse == ALLOW) .. 잘못된 메모리 영역에 대해 오류를 반환합니다. 제 질문이 여기 있습니다. 나는 이것을 원하지 않았다. 그래서 나는 잘못된 것을하고 있습니다. 편집 : 잠깐 만요. 나는 바보입니다. 그것은'static'이 반대이기 때문에 전역 적으로 선언해서는 안됩니다. – Genis