内联方法名称的 GCC 预处理器

发布于 2024-09-05 00:56:45 字数 334 浏览 6 评论 0原文

我正在开发一个项目,其中的代码如下:

#define NAME() Array

inline NAME()* NAME()_init (void* arg0){return (NAME()*)Object_init(arg0);}

但我得到以下结果:

inline Array* Array _init (void* arg0){return (Array*)Object_init(arg0);}

“Array”和“_init”之间有空格 因为这是一个函数名称,所以我显然不需要空格。有谁知道怎么把空间弄出来吗?

I'm working on a project where I have code like the following:

#define NAME() Array

inline NAME()* NAME()_init (void* arg0){return (NAME()*)Object_init(arg0);}

But I get the following result:

inline Array* Array _init (void* arg0){return (Array*)Object_init(arg0);}

With a space between the "Array" and the "_init"
Because this is a function name, I obviously do not want the space. Does anyone know how to get the space out?

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

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

发布评论

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

评论(2

◇流星雨 2024-09-12 00:56:46

您应该像这样更改语义:

#define NAME(X) Array##X
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}

编辑:至少它可以与 GNU cpp 一起使用。

EDIT2:也尝试过-ansi -pedantic,它似乎在没有警告的情况下工作......

You should change the semantics in something like this:

#define NAME(X) Array##X
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}

EDIT: At least it works with GNU cpp.

EDIT2: tried also with -ansi -pedantic and it seemed to work without warning...

此岸叶落 2024-09-12 00:56:45

将两个标记合并为一个的唯一方法(例如,将调用 NAME()_init 的结果组合起来)是使用串联运算符 (## )。您需要这样做:

#define REAL_CONCATENATE(x, y) x ## y
#define CONCATENATE(x, y) REAL_CONCATENATE(x, y)

#define NAME() Array
inline NAME()* CONCATENATE(NAME(), _init) (void* arg0){return (NAME()*)Object_init(arg0);}

是的,额外的间接级别是必要的< /a>.

请注意,如果不带参数,则不需要使用类似函数的宏,因此您可以轻松使用:

#define NAME Array
inline NAME* CONCATENATE(NAME, _init) (void* arg0){return (NAME*)Object_init(arg0);}

The only way to combine two tokens into one (e.g., to combine the result of invoking NAME() and _init) is to use the concatenation operator (##). You'll need to do something like so:

#define REAL_CONCATENATE(x, y) x ## y
#define CONCATENATE(x, y) REAL_CONCATENATE(x, y)

#define NAME() Array
inline NAME()* CONCATENATE(NAME(), _init) (void* arg0){return (NAME()*)Object_init(arg0);}

Yes, the extra level of indirection is necessary.

Note that you don't need to use a function-like macro if you take no parameters, so you could just as easily use:

#define NAME Array
inline NAME* CONCATENATE(NAME, _init) (void* arg0){return (NAME*)Object_init(arg0);}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文