가변 매크로(변수 인수 수)를 만드는 방법
특정 수가 아닌 임의의 수의 파라미터를 받아들이는 매크로를 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
'programing' 카테고리의 다른 글
@BeforeClass 및 상속 - 실행 순서 (0) | 2022.09.03 |
---|---|
Android 아카이브 라이브러리(aar)와 표준 jar (0) | 2022.09.03 |
메이븐은 왜 그렇게 평판이 나쁜가요? (0) | 2022.09.03 |
maven build가 실패한 지점부터 시작할 수 있습니까? (0) | 2022.09.03 |
vuex에서 registerModule/unregisterModule을 사용하는 동안 메모리 누수가 발생함 (0) | 2022.09.03 |