#define debug(x) printf##x

发布于 2022-09-13 00:19:12 字数 477 浏览 25 评论 0

a.cpp文件里有个宏

#define debug(x) printf##x

在程序里调用,还是很方便的,

debug(("WndProc->hWnd:%d\n", hWnd));

上面这个宏在VisualStudio里没报错,
但改为g++编译器,在cmake里就报错了

error: pasting "printf" and "(" does not give a valid preprocessing token
 #define debug(x) printf##x
                  ^

这个宏的意思是将输入内容x与printf拼接起来,
实际调用是,x 相当于 ("WndProc->hWnd:%d\n", hWnd)
也就是说,连括号一起传值,但g++不干了,
msvc里面的cl.exe没报错,

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苏佲洛 2022-09-20 00:19:12

你这种用法本身就不是一种标准化的用法,需要依赖编译器的支持,建议你不要这么用。
用不定参数的宏就可以实现你的需求,还不需要双重括号。

#define debug(...) printf(__VA_ARGS__)
debug("WndProc->hWnd:%d\n", hWnd);
陌路终见情 2022-09-20 00:19:12

不清楚为什么会报错,但是这里有更好的替代办法:

#include <bits/stdc++.h>
using namespace std;

#define debug(x) cout << "[" << #x << "]: " << x

int main(){
    int hWnd = 2;
    debug(hWnd);

    return 0;
}

输出:

[hWnd]: 2
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文