#define debug(x) printf##x

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没报错,

阅读 3.8k
2 个回答

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

#define debug(...) printf(__VA_ARGS__)
debug("WndProc->hWnd:%d\n", hWnd);

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

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

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

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

    return 0;
}

输出:

[hWnd]: 2
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏