문제

나는 프로그램을보고 있었다 http://www0.us.ioccc.org/1988/westley.c, 언급 또 다른 대답 - PI의 값을 3.142 정도 인쇄해야하지만 컴파일하고 실행하면 얻을 때 0.250. GCC 전 처리기 (4.1.2 및 3.4.6 모두 테스트)가 코드에서 실행될 때 보입니다.

#define _ -F<00||--F-OO--;
_-_-_

에게

-F<00||--F-OO--;- -F<00||--F-OO--;- -F<00||--F-OO--;

하지만 프로그램이 작동하기 위해서는

-F<00||--F-OO--;--F<00||--F-OO--;--F<00||--F-OO--;

IE GCC는 "매크로"확장 전에 추가 공간을 삽입하고 있습니다. 그게 길입니다 #define 작동해야합니까? (1988 년 이후로 바뀌 었습니까?)

편집하다: 또한 공간이 나타나는 것을 방지하는 방법에 대한 정보는 감사 할 것입니다.

도움이 되었습니까?

해결책

사전 처리기는 엄격하게 텍스트가 아닌 토큰에서 작동합니다. 따라서 기술적으로 그것은 사이에 "공간을 넣지"않지만 두 토큰을 함께 붙여 넣으라고 명시 적으로 말하지 않는 한 ## 연산자, 그렇지 않습니다. 이 경우 둘입니다 -매크로 라인을 가로 지르는 것은 두 개의 다른 토큰으로 계산됩니다. 둘 다 외부 마이너스를 의미하며 감소하지 않습니다.

또한보십시오: http://en.wikipedia.org/wiki/c_preprocessor#token_catenation

다른 팁

1989 년 버전의 C 표준이 표준화되기 전에 1988 년에 1988 년에 20 년 전에 원래 항목이 제출 된 추가 공간을 삽입하지 않았다. 당신은 통과 할 수 있습니다 -traditional-cpp ISO C 전 처리기와 달리 구식 C 프리 프로세서의 동작을 모방하게하는 GCC 전 처리기에 플래그.

C99 표준에서 :

양식의 전처리 지침

# 정의 식별자 교체 목록 새 라인

매크로 이름의 각 후속 인스턴스가 지침의 나머지 부분을 구성하는 전처리 토큰의 대체 목록으로 대체되는 객체와 같은 매크로를 정의합니다.

따라서 매크로는 토큰에서 작동하고 화이트 페이스가 예상됩니다.

그리고 토큰 붙여 넣기 연산자를 사용하고 싶은 출력을 얻을 수 있습니다. ##, 그러나 당신은 그것을 위해 더 거시적 인 추악함을 사용해야합니다.

#define PASTE2( x, y) x##y
#define PASTE( x, y) PASTE2(x, y)

#define _ -F<00||--F-OO--;


PASTE(PASTE(PASTE(PASTE(_,-),_),-),_)

그래서 나는 이것이 당신에게 진정한 대답인지 확실하지 않습니다.

당신은 덜 못생긴 매크로 세트를 사용하여 원하는 표현을 얻을 수 있습니다. 여전히 공간이 있지만 공간은--'운영자 :

_ PASTE(-,_) PASTE(-,_)

그래도 그게 당신이 원하는 것 같아요.

예, GCC는 추가 공간을 삽입하고 있습니다 (stdout 출력을 확인하여 확인하십시오. gcc -E westley.c(. 내가 아는 한,이 동작은 표준을 준수합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top