C winapi-使用宏在MessageBox中显示int变量值

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

出于调试的目的,我试图制作一个简短的宏来显示各种类型,而不是不断复制所有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)

如何定义使用变量值而不是名称的宏?

您不能。预处理器对变量及其值一无所知,因为它只在编译时运行时不做任何事情。

您需要在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中内置了一个日志/跟踪框架:。如果希望在发布的产品中保留日志记录/跟踪代码,这将非常有用。通过附加侦听器,可以在运行时动态启用和禁用日志记录/跟踪。