#define SEND_VALUE(num, point1, point2, point3...) \
{ \
char number[6]; \
char p1[6];\
char p2[6];\
char p3[6];\
if(num == ONE) {sprintf(number, "ONE");}\
if(num == TWO) {sprintf(number, "TWO");}\
if(num == THREE) {sprintf(number, "THREE");}\
if(point1 == ONE) {sprintf(p1, "ONE");}\
if(point1 == TWO) {sprintf(p1, "TWO");}\
if(point1 == THREE) {sprintf(p1, "THREE");}\
if(point2 == ONE) {sprintf(p2, "ONE");}\
if(point2 == TWO) {sprintf(p2, "TWO");}\
if(point2 == THREE) {sprintf(p2, "THREE");\
if(point3 == ONE) {sprintf(p3, "ONE");}\
if(point3 == TWO) {sprintf(p3, "TWO");}\
if(point3 == THREE) {sprintf(p3, "THREE");\
fprintf(fp,"%s:%s:%s:%s:\n",number, p1,p2,p3);\
fflush(fp); \
fprintf(fp,fmt,##__VA_ARGS__);\
fflush(fp); \
fprintf(fp,"\n");\
fflush(fp); \
}
截至目前,此宏不需要变量。但是为了将来的使用,我希望它是可变的。我不知道如何在可变参数宏中编写/定义参数列表以及如何使用它们。如上所述,例如,p1,p2应设置并打印。
我这样称呼这个宏:
SEND_VALUE(ONE, ONE, ONE, ONE);
有人可以帮助实现这种可变方式吗?
答案 0 :(得分:1)
假设您还获得fmt
作为宏参数,这里是您宏的缩短版本:
#define SEND_VALUE(num, point1, point2, point3, ...) \
do { \
fprintf(fp,#num":"#point1":"#point2":"#point3":\n");\
fflush(fp); \
fprintf(fp,__VA_ARGS__);\
fflush(fp); \
fprintf(fp,"\n");\
fflush(fp); \
} while(0)
如果您想明确表示格式,您也可以这样做:
#define SEND_VALUE(num, point1, point2, point3, fmt, ...) \
do { \
fprintf(fp,#num":"#point1":"#point2":"#point3":\n");\
fflush(fp); \
fprintf(fp,fmt,##__VA_ARGS__);\
fflush(fp); \
fprintf(fp,"\n");\
fflush(fp); \
} while(0)
但您应该注意,##__VA_ARGS__
是gcc扩展名。
几点说明:
do { } while(0)
扩展到代码块的宏是万无一失的;它们可以作为单个语句放在if
/ while
/ etc块中,它们也可以接受;
而不会产生运行时开销。#param
获取其值为参数名称的字符串。在您的示例SEND_VALUE(ONE, ONE, ONE, ONE)
中,#num
将为"ONE"
。"some"" string"
中相当于"some string"
。fp
作为参数传递给宏,那会更好。编辑:最后,您的宏可以像这样使用:
SEND_VALUE(ONE, ONE, ONE, ONE, "");
SEND_VALUE(ONE, TWO, ONE, THREE, "%d", 10);
SEND_VALUE(THREE, TWO, ONE, TWO, "format string! %s %s", "param1", "param2");