带有特殊变量参数的C宏

时间:2015-04-21 20:56:20

标签: c

我总是写下面的代码用于调试目的:

printf("%s:%d this is a string %s int %d",__FUNCTION__,__LINE__,strval,intval);

现在因为总是使用第一部分(FUNCTION,LINE),所以我希望创建一个宏来执行它并且只是附加其他调试字符串。

也许看起来像:

#define MYPRINT(args...) printf("%s:%d",__FUNCTION__,__LINE__);printf(##args)

但我希望使用一个声明,而不是如上所述!有可能吗?

澄清不重复this one

这是不同的,因为我希望在print命令中添加一些新字段。实际上这里的答案很棒,感谢所有人的帮助!

3 个答案:

答案 0 :(得分:5)

如果您想要对printf()进行一次调用,则您的MYPRINT需要知道格式字符串。你可以尝试这样的东西,只要格式字符串是文字:

#define MYPRINT(FMT, ...) printf("%s:%d " FMT, __FUNCTION__, __LINE__, ##__VA_ARGS__)

##是一个GCC(可能是其他)编译器扩展,在__VA_ARGS__实际为空的情况下吞下逗号。如果您的编译器不支持它,请将其关闭。

答案 1 :(得分:4)

您可以使用可变参数宏并使用,来生成一个语句:

#define MYPRINT(...) (printf("%s:%d",__FUNCTION__,__LINE__), printf(__VA_ARGS__))

答案 2 :(得分:1)

这个怎么样:

#include <stdio.h>

#define MYPRINT(fmt, ...) \
    printf("[%s]:%d - " fmt "\n", __FUNCTION__, __LINE__, __VA_ARGS__)

int main() {
    char const *s = "My string";
    int i = 42;
    MYPRINT("%s, %d", s, i);
}

输出:

[main]:8 - My string, 42