C winapi-使用宏在MessageBox中显示int变量值
出于调试的目的,我试图制作一个简短的宏来显示各种类型,而不是不断复制所有MessageBox函数的参数 对于字符串,我有以下宏:C winapi-使用宏在MessageBox中显示int变量值,c,winapi,macros,C,Winapi,Macros,出于调试的目的,我试图制作一个简短的宏来显示各种类型,而不是不断复制所有MessageBox函数的参数 对于字符串,我有以下宏: #define DEBUG(x) MessageBox(NULL, x,"DEBUG",MB_ICONINFORMATION|MB_OK); 不管我是传递char的变量数组还是直接字符串,都认为它工作得很好 现在,我尝试对int做同样的事情。我们定义了如下宏: #define STRIGIFY(x) #x #define TOSTRING(x) STRIGIFY(x
#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)
如何定义使用变量值而不是名称的宏?您不能。预处理器对变量及其值一无所知,因为它只在编译时运行时不做任何事情。您需要在VS 2015中使用类似sprintf或snprintf的东西将变量打印到一个字符缓冲区数组,并将结果输出作为要显示的字符串传递给MessageBox。您可以使用变量参数列表
#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版本。这并不能回答所提出的问题,但我会冒着声誉的风险,提出不同的解决方案 请帮自己一个忙,不要使用MessageBox或其他模式UI来显示调试信息。如果您确实希望在该点中断程序执行,请使用断点;它还允许您附加条件,这样您就不需要手动检查该值 如果不希望中断,只需使用::OutputDebugString将值打印到调试输出窗口。如果已附加,则可以在调试器中看到,或者通过DebugView工具看到
对VisualStudio用户的另一个小建议是:如果在输出前加上源文件名和代码行号,双击“输出”窗口中的该行将直接进入该行。只需在格式化字符串中使用uuu FILE_uuuuuu和uuu LINE_uuuu即可。有没有办法将此转换包装到宏中?类似这样的内容:定义DEBUGINTx{char buf[16];int value=x;sprintfbuf,%d,value;DEBUGbuf}不要这样做。宏不是前进的方向。鲜为人知的是,Windows中内置了一个日志/跟踪框架:。如果希望在发布的产品中保留日志记录/跟踪代码,这将非常有用。通过附加侦听器,可以在运行时动态启用和禁用日志记录/跟踪。