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

时间:2015-11-20 14:40:35

标签: 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 DEBUGINT(x) DEBUG(TOSTRING(x))

仅在我传递直接整数值时才有效:

DEBUGINT(742);

但是,如果我传递int变量,MessageBox会显示变量名称而不是其值:

int count = 3;
DEBUGINT(count);

我发现对我来说非常有趣的是,我可以在DEBUGINT宏中传递任何字面内容,它仍然可以工作:

DEBUGINT(some unescaped string)

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

4 个答案:

答案 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版本。