C #定义宏不';t打印变量

C #定义宏不';t打印变量,c,C,我有以下代码: #define PRINT(fmt, ...) printf("%s:%d: "fmt, __FILE__, __LINE__, ## __VA_ARGS__) 当我向它传递一些值时,它工作得很好,例如PRINT(“Hello,world”)。 但是当我将变量作为参数传递时,例如,PRINT(somevar)它不会打印变量intsomevar的值。如何重写宏以使其同时打印变量?问题不在宏中。这取决于你如何使用它。本质上,您的使用要求将PRINT与格式字符串一起使用,格式字符串

我有以下代码:

#define PRINT(fmt, ...) printf("%s:%d: "fmt, __FILE__, __LINE__, ##  __VA_ARGS__)
当我向它传递一些值时,它工作得很好,例如
PRINT(“Hello,world”)。

但是当我将变量作为参数传递时,例如,
PRINT(somevar)
它不会打印变量
intsomevar
的值。如何重写宏以使其同时打印变量?

问题不在宏中。这取决于你如何使用它。本质上,您的使用要求将PRINT与格式字符串一起使用,格式字符串必须是描述如何处理后续参数的字符串文字

例如,试试看

PRINT("x = %d y = %d\n", x, y);

其中
x
y
int
类型的变量,问题不在宏中。这取决于你如何使用它。本质上,您的使用要求将PRINT与格式字符串一起使用,格式字符串必须是描述如何处理后续参数的字符串文字

例如,试试看

PRINT("x = %d y = %d\n", x, y);

其中
x
y
int
类型的变量,问题不在宏中。这取决于你如何使用它。本质上,您的使用要求将PRINT与格式字符串一起使用,格式字符串必须是描述如何处理后续参数的字符串文字

例如,试试看

PRINT("x = %d y = %d\n", x, y);

其中
x
y
int
类型的变量,问题不在宏中。这取决于你如何使用它。本质上,您的使用要求将PRINT与格式字符串一起使用,格式字符串必须是描述如何处理后续参数的字符串文字

例如,试试看

PRINT("x = %d y = %d\n", x, y);

如果
x
y
int

类型的变量,您的意思是我最好将其作为常规例程重写并使用va_list?除非宏的
fmt
(第一)参数可以与
%s:%d:
字符串串联,否则宏将无法工作,这意味着它也必须是文本。要打印
int-somevar
,宏调用必须是
print(“%d\n”,somevar)。简而言之,您也不能将
printf
作为
printf(some\u int\u var)
调用;需要一个格式字符串。这也没什么不同(事实上,作为常量文本是强制性的,因为您的逻辑现在要求它是concat-able,而计算格式字符串是不可行的,公平警告)。发送到该文件的唯一快捷方式就像
printf
,一个
char*
(const或其他)本身,就像
printf
,出于安全原因,不鼓励使用该链接。@JonathanLeffler该链接非常棒。谢谢。您的意思是我最好将其作为常规例程重写并使用va_列表?除非宏的
fmt
(第一个)参数可以与
“%s:%d:”
字符串串联,否则宏将无法工作,这意味着它也必须是文本。要打印
int-somevar
,宏调用必须是
print(“%d\n”,somevar)。简而言之,您也不能将
printf
作为
printf(some\u int\u var)
调用;需要一个格式字符串。这也没什么不同(事实上,作为常量文本是强制性的,因为您的逻辑现在要求它是concat-able,而计算格式字符串是不可行的,公平警告)。发送到该文件的唯一快捷方式就像
printf
,一个
char*
(const或其他)本身,就像
printf
,出于安全原因,不鼓励使用该链接。@JonathanLeffler该链接非常棒。谢谢。您的意思是我最好将其作为常规例程重写并使用va_列表?除非宏的
fmt
(第一个)参数可以与
“%s:%d:”
字符串串联,否则宏将无法工作,这意味着它也必须是文本。要打印
int-somevar
,宏调用必须是
print(“%d\n”,somevar)。简而言之,您也不能将
printf
作为
printf(some\u int\u var)
调用;需要一个格式字符串。这也没什么不同(事实上,作为常量文本是强制性的,因为您的逻辑现在要求它是concat-able,而计算格式字符串是不可行的,公平警告)。发送到该文件的唯一快捷方式就像
printf
,一个
char*
(const或其他)本身,就像
printf
,出于安全原因,不鼓励使用该链接。@JonathanLeffler该链接非常棒。谢谢。您的意思是我最好将其作为常规例程重写并使用va_列表?除非宏的
fmt
(第一个)参数可以与
“%s:%d:”
字符串串联,否则宏将无法工作,这意味着它也必须是文本。要打印
int-somevar
,宏调用必须是
print(“%d\n”,somevar)。简而言之,您也不能将
printf
作为
printf(some\u int\u var)
调用;需要一个格式字符串。这也没什么不同(事实上,作为常量文本是强制性的,因为您的逻辑现在要求它是concat-able,而计算格式字符串是不可行的,公平警告)。发送到该文件的唯一快捷方式就像
printf
,一个
char*
(const或其他)本身,就像
printf
,出于安全原因,不鼓励使用该链接。@JonathanLeffler该链接非常棒。谢谢,乔纳森·莱弗勒和罗布。极好的你很快就解决了我的问题@乔纳森·莱夫勒和罗布。极好的你很快就解决了我的问题@乔纳森·莱夫勒和罗布。极好的你很快就解决了我的问题@乔纳森·莱夫勒和罗布。极好的你很快就解决了我的问题!!