2016-07-22 2 views
0

명시 적으로 매크로의 인수로 전달하지 않고 매크로 다음의 다음 코드 문을 사용하는 C 매크로, GCC 지시문 또는 pragma가 있습니까? 이 같은C 매크로 또는 다음 코드 문을 사용하는 GCC 지시문

뭔가 :

#define CONSUME_NEXT_IF(a) if (a) { (<next>) } else; 

그리고로 사용할 것 :

CONSUME_NEXT_IF(a) stmt1; 

그리고 그것은으로 확장 할 것으로 예상 :

if (a) stmt1; 
    else; 

내가 여기 if 문을 사용하고 있습니다 예를 들면. 조건문은 실제로는 인수로 전달하지 않고 매크로에 의해 stmt1을 소비하는 기능입니다. atrue (비 - 제로) 인 경우

+1

'(a) &&'해야합니다. – EOF

+0

@ EOF, 제발 좀 더 자세히 설명해 주시겠습니까? – John

+0

Mhh, 실제로는 항상 작동하지는 않습니다. 'stmt1'이 항상 괄호로 묶이거나'&&'보다 낮은 우선 순위의 연산자를 포함하지 않도록해야합니다. – EOF

답변

2
#define CONSUME_NEXT_IF(a) if (!(a)) {} else 

만 (매크로 사용하고 다음 ; 사이) "다음 문장"을 실행하는 효과를 달성한다. 표현 유형이 a 인 적합한 제약 조건이있는 경우 을 (a)에서 제거 할 수 있습니다.

개인적으로 주석에 비슷한 효과를 원한다고 설명했지만 필자는 코드 난독 화와 같은 유지 관리 문제가 완화 될 것이라고 생각합니다. 특히 a 또는 stmt1에서 사용되는 다른 매크로와 상호 작용하는 경우.

물론 매크로를 사용하려면 "대형 코드베이스"를 수정해야합니다. a는 고정 컴파일 시간 값을하지 않는 한이 (실행에 방출되는 stmt1에 대한 코드를 중단하지 않고, 컴파일러 감지하고 이러한 상황에서 코드를 최적화하는 기능을 가지고 있습니다 -

이 또한 실행에 죽은 코드를 잎). 따라서 이러한 구성은 불필요한 코드를 방지해야하는 여러 보증 표준의 요구 사항을 충족시킬 수 없음을 의미합니다.

+0

코드 골프에 대해 걱정한다면 '#define CONSUME_NEXT_IF (a) if (! (a)); else '를 사용하여 괄호를 제거함으로써 연산자 우선 순위를 높이는 위험을 피할 수 있습니까? – EOF

+0

코드 골프와 관련이 없습니다. – Peter

관련 문제