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

内联方法名称的GCC预处理器,c,gcc,c-preprocessor,stringification,C,Gcc,C Preprocessor,Stringification,我正在从事一个项目,我有如下代码: #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);} 在“数组”和“_init”之间有一个空格 因为这是一个函数名,我显然不想要空格。有人知道如何释

我正在从事一个项目,我有如下代码:

#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);}
在“数组”和“_init”之间有一个空格
因为这是一个函数名,我显然不想要空格。有人知道如何释放空间吗?

您应该更改以下内容的语义:

#define NAME(X) Array##X
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}
编辑:至少它可以与GNU cpp一起使用


EDIT2:也尝试了
-ansi-pedantic
,它似乎在没有任何警告的情况下工作…

您应该更改如下语义:

#define NAME(X) Array##X
inline NAME()* NAME(_init) (void* arg0){return (NAME()*)Object_init(arg0);}
编辑:至少它可以与GNU cpp一起使用


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

将两个标记组合成一个标记的唯一方法(例如,将调用
NAME()
\u 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);}

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

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

将两个标记组合成一个标记的唯一方法(例如,组合调用
NAME()
\u 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);}

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

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

它可能是,但是OP指定了GNU预处理器,我已经用它进行了测试;我的错误。C99增加了对空参数的支持。它可能是,但OP指定了GNU预处理器,我已经用itSorry进行了测试;我的错误。C99增加了对空参数的支持。它称为令牌粘贴,而不是在串接、粘贴之前、不需要任何操作符的情况下发生串接串连接。@ PTE: C和C++语言标准都使用了连接字;这并不意味着标记连接与字符串文字连接(或任何其他形式的连接)是同一回事。它被称为标记粘贴,而不是连接-字符串连接发生在标记化之后,粘贴之前,并且不需要任何操作符。@ PTE:C和C++语言标准都使用了连接词;这并不意味着令牌连接与字符串文字连接(或任何其他形式的连接)是一回事。