## 宏参数串联没有按我的预期工作

发布于 2024-11-02 10:56:03 字数 690 浏览 3 评论 0原文

难道不应该:

#define MOGSH_CONCAT (x,y) x##y
#define MOGSH_DOUBLE (a,b) MOGSH_CONCAT(a,b)
#define MOGSH_DEFINEPROC (p) MOGSH_DOUBLE(_gt,p) options_dialog::p;

MOGSH_DEFINEPROC(AssignMainForm);

高兴地扩展到:

_gtAssignMainForm options_dialog::AssignMainForm;

鉴于 _gt 未定义,_gtAssignMainForm 是:

typedef void (__stdcall *_gtAssignMainForm)();

并且 options_dialog 只是一个类,其中 AssignMainForm 是一个静态成员。

相反,在 MSVC9 中,我收到错误:

'a' : undeclared identifier

在包含

MOGSH_DEFINEPROC(AssignMainForm);

Shouldn't this:

#define MOGSH_CONCAT (x,y) x##y
#define MOGSH_DOUBLE (a,b) MOGSH_CONCAT(a,b)
#define MOGSH_DEFINEPROC (p) MOGSH_DOUBLE(_gt,p) options_dialog::p;

MOGSH_DEFINEPROC(AssignMainForm);

happily expand to:

_gtAssignMainForm options_dialog::AssignMainForm;

Given that _gt is not defined, _gtAssignMainForm is:

typedef void (__stdcall *_gtAssignMainForm)();

and options_dialog is just a class where AssignMainForm is a static member.

Instead, in MSVC9, I get the error:

'a' : undeclared identifier

on the line containing

MOGSH_DEFINEPROC(AssignMainForm);

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

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

发布评论

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

评论(1

心在旅行 2024-11-09 10:56:03

在类函数宏的定义中,宏名称和参数列表开头的 ( 之间不能有空格。

#define MOGSH_CONCAT(x,y) x##y 
//                  ^ no whitespace allowed here

正如您现在所看到的(带有空格),MOGSH_CONCAT 是一个类似对象的宏,其替换列表为 (x,y) x##y,这就是为什么您会得到如此奇怪的结果。

In the definition of a function-like macro there can be no whitespace between the macro name and the ( beginning the parameter list.

#define MOGSH_CONCAT(x,y) x##y 
//                  ^ no whitespace allowed here

As you have it now (with whitespace), MOGSH_CONCAT is an object-like macro with a replacement list of (x,y) x##y, which is why you are getting such strange results.

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