문제

특정 숫자가 아닌 여러 매개 변수를 수락하는 C에 매크로를 쓰고 싶습니다.

예시:

#define macro( X )  something_complicated( whatever( X ) )

어디 X 여러 매개 변수입니다

나는 이것을 필요로한다 whatever 오버로드되어 2 또는 4 매개 변수로 호출 할 수 있습니다.

매크로를 두 번 정의하려고 시도했지만 두 번째 정의는 첫 번째 정의를 덮었습니다!

내가 작업하고있는 컴파일러는 G ++입니다 (특히 Mingw)

도움이 되었습니까?

해결책

C99 Way, VC ++ 컴파일러에서도 지원합니다.

#define FOO(fmt, ...) printf(fmt, ##__VA_ARGS__)

다른 팁

__VA_ARGS__ 그것을하는 표준 방법입니다. 필요하지 않은 경우 컴파일러 별 해킹을 사용하지 마십시오.

원래 게시물에 댓글을 달 수 없다는 것이 정말 화가났습니다. 어쨌든 C ++는 C의 슈퍼 세트가 아닙니다. C ++ 컴파일러로 C 코드를 컴파일하는 것은 정말 어리석은 일입니다. 도니가하지 않는 일을하지 마십시오.

나는 그것이 가능하지 않다고 생각한다. 당신은 이중 파렌으로 가짜를 가짜로 만들 수있다.

#define macro(ARGS) some_complicated (whatever ARGS)
// ...
macro((a,b,c))
macro((d,e))
#define DEBUG

#ifdef DEBUG
  #define PRINT print
#else
  #define PRINT(...) ((void)0) //strip out PRINT instructions from code
#endif 

void print(const char *fmt, ...) {

    va_list args;
    va_start(args, fmt);
    vsprintf(str, fmt, args);
        va_end(args);

        printf("%s\n", str);

}

int main() {
   PRINT("[%s %d, %d] Hello World", "March", 26, 2009);
   return 0;
}

컴파일러가 Variadic 매크로를 이해하지 못하면 다음 중 하나로 인쇄물을 제거 할 수도 있습니다.

#define PRINT //

또는

#define PRINT if(0)print

첫 번째는 인쇄 지침을 언급하고, 두 번째는 널 IF 조건으로 인해 인쇄 명령을 방지합니다. 최적화가 설정되면 컴파일러는 다음과 같은 지침을 실행하지 않아야합니다. if (0) print ( "Hello World"); 또는 ((void) 0);

여기에서 G ++에 대해 설명했지만 C99의 일부이지만 모두에게 효과적입니다.

http://www.delorie.com/gnu/docs/gcc/gcc_44.html

: 빠른 예 : 예 : : : : 예 : : 예 : : 예 : : 예 : : 예 : : 예 : 예 : : 예 : : 예 : 예 : : 예 : 예 : : 예 : 예 : : 예 : 예 : : 예 : 예 : : 예 : 예 : : 예 : 예 : : 예 : 예 : : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : 예 : : 예 : : 예 : : 예 : 예)

#define debug(format, args...) fprintf (stderr, format, args)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top