programing

가변 매크로(변수 인수 수)를 만드는 방법

yoursource 2022. 9. 3. 17:16
반응형

가변 매크로(변수 인수 수)를 만드는 방법

특정 수가 아닌 임의의 수의 파라미터를 받아들이는 매크로를 C에 쓰고 싶다.

예:

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

어디에X임의의 수의 파라미터입니다.

이게 필요한 이유는whatever가 과부하되어 2개의 파라미터 또는4개의 파라미터를 사용하여 호출할 수 있습니다.

매크로를 두 번 정의하려고 했는데 두 번째 정의가 첫 번째 정의를 오버랩합니다!

현재 사용하고 있는 컴파일러는 g++(구체적으로는 mingw)입니다.

C99 방식, 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;
}

컴파일러가 가변 매크로를 인식하지 못하는 경우 다음 중 하나를 사용하여 PRINT를 삭제할 수도 있습니다.

#define PRINT //

또는

#define PRINT if(0)print

첫 번째는 PRINT 지침을 코멘트하고, 두 번째는 NULL if 조건으로 인해 PRINT 명령을 차단합니다.최적화가 설정되어 있는 경우 컴파일러는 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)

• 변수 개수의 인수는 생략 부호(...)로 표시됩니다.ISO C 구문은 '...' 앞에 적어도 하나의 고정 인수가 필요합니다.

예를 들어 다음과 같이 입력할 수 있습니다.

#define DEBUGMSG ( int, ...)

언급URL : https://stackoverflow.com/questions/679979/how-to-make-a-variadic-macro-variable-number-of-arguments

반응형