出于调试目的,我试图制作一个简短的宏来显示各种类型,而不是不断复制所有MessageBox
函数'参数。
对于字符串我有以下宏:
#define DEBUG(x) MessageBox(NULL, x,"DEBUG",MB_ICONINFORMATION|MB_OK);
调用它工作得很好,我是否传递变量(char
数组)或直接字符串。
现在,我尝试为int
做同样的事情。定义了这样的宏:
#define STRIGIFY(x) #x
#define TOSTRING(x) STRIGIFY(x)
#define DEBUGINT(x) DEBUG(TOSTRING(x))
仅在我传递直接整数值时才有效:
DEBUGINT(742);
但是,如果我传递int
变量,MessageBox
会显示变量名称而不是其值:
int count = 3;
DEBUGINT(count);
我发现对我来说非常有趣的是,我可以在DEBUGINT
宏中传递任何字面内容,它仍然可以工作:
DEBUGINT(some unescaped string)
如何定义使用变量值而不是名称的宏?
答案 0 :(得分:3)
这不会回答问题,但是我会冒着声誉冒险并提出不同的解决方案。
请帮个忙,不要使用MessageBox()
或其他模态UI来显示调试信息。如果你想在那时中断程序执行,请使用断点;它还允许您附加条件,这样您就不需要手动检查该值。
如果您不想中断,只需使用::OutputDebugString()
将值打印到调试输出窗口。如果附加了调试器,或者通过DebugView
工具,可以在调试器中看到。
另一个小建议(对于Visual Studio用户):如果您在输出前添加源文件名和代码行号,则在输出窗口中双击该行将直接转到该行。只需在格式化的字符串中使用__FILE__
和__LINE__
。
答案 1 :(得分:2)
你做不到。预处理器对变量或它们的值一无所知,因为它不会在编译时执行任何运行时。
答案 2 :(得分:1)
你需要"打印"使用char
(或VS 2015中的sprintf
)之类的变量到缓冲区(snprintf
数组)并将结果输出传递给MessageBox
作为要显示的字符串
答案 3 :(得分:1)
您可以使用变量参数列表
#include <stdio.h>
void message(const char* format, ...)
{
int len;
char *buf;
va_list args;
va_start(args, format);
len = _vscprintf(format, args) + 1; //add room for terminating '\0'
buf = (char*)malloc(len * sizeof(char));
vsprintf_s(buf, len, format, args);
MessageBoxA(0,buf,"debug",0);
//OutputDebugStringA(buf);
free(buf);
}
message("test %s %d %d %d", "str", 1, 2, 3);
您可能还想更改为unicode版本。