在定义macros的Pragma
有没有其他的方式来embeddedmacros语句与其他语句的编译指示语句?
我正在试图达到像这样的东西:
#define DEFINE_DELETE_OBJECT(type) \ void delete_ ## type_(int handle); \ void delete_ ## type(int handle); \ #pragma weak delete_ ## type_ = delete_ ## type
如果存在的话,我可以使用boost解决scheme(除波)。
如果您使用的是c99或c ++ 0x,则使用编译指示符运算符
_Pragma("argument")
相当于
#pragma argument
除了它可以在macros中使用(参见c99标准的6.10.9或c ++ 0x final委员会草案的16.9)
例如,
#define STRINGIFY(a) #a #define DEFINE_DELETE_OBJECT(type) \ void delete_ ## type ## _(int handle); \ void delete_ ## type(int handle); \ _Pragma( STRINGIFY( weak delete_ ## type ## _ = delete_ ## type) ) DEFINE_DELETE_OBJECT(foo);
当放入gcc -E
给出
void delete_foo_(int handle); void delete_foo(int handle); #pragma weak delete_foo_ = delete_foo ;
使用_Pragma(“参数”)可以做的一件好事是用它来处理一些编译器问题,如
#ifdef _MSC_VER #define DUMMY_PRAGMA _Pragma("argument") #else #define DUMMY_PRAGMA _Pragma("alt argument") #endif
不,没有可行的方法。 再一次,根本没有便携的方式来使用#pragma。 正因为如此,许多C / C ++编译器定义了自己的方法来编写类似于编译指示的东西,而且它们通常可以embedded到macros中,但是每个编译器都需要不同的macros定义。 如果你愿意走这条路,你最终会做这样的事情:
#if defined(COMPILER_GCC) #define Weak_b #define Weak_e __attribute__((weak)) #elif defined(COMPILER_FOO) #define Weak_b __Is_Weak #define Weak_e #endif #define DEFINE_DELETE_OBJECT(type) \ Weak_b void delete_ ## type_(int handle) Weak_e; \ Weak_b void delete_ ## type(int handle) Weak_e;
如果它不明显,你想定义Weak_b
和Weak_e
作为开始和结束包围结构,因为像GCC这样的编译器添加属性作为types签名的附录,有些像MSC添加它作为前缀(或至less它曾经有一次,因为我已经使用了MSC)。 使用包围构造,即使必须将整个types签名传递到编译器构造中,也可以定义始终有效的东西。
当然,如果你尝试把这个移植到一个没有你想要的属性的编译器上,没有什么可以做的,但是把这些macros放到什么地方,希望你的代码仍然可以运行。 如果纯粹警告或优化杂注,这很可能。 在其他情况下,不是那么多。
呵呵,我怀疑你实际上需要将Weak_b和Weak_e定义为需要参数的macros,但是我不愿意通过文档来了解如何为这个例子创build一个弱定义。 我把这个留给读者作为练习。
有没有其他的方式来embedded编译语句macros与其他语句?
不,您不能将预处理器语句放入预处理器语句中。 但是,您可以将其放入inline
函数中。 虽然这打败了C
标签。