有没有办法在宏中嵌入杂注语句和其他语句?
我正在尝试实现一些类似的东西:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
我可以使用boost解决方案(除了wave),如果有的话。
发布于 2010-06-13 06:22:28
如果使用的是c99或c++0x,则有杂注运算符,用作
_Pragma("argument")
这相当于
#pragma argument
除非它可以在宏中使用(参见c99标准的6.10.9节,或c++0x最终委员会草案的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
;
发布于 2012-02-28 23:34:33
使用_Pragma(“参数”)可以做的一件好事就是使用它来处理一些编译器问题,比如
#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif
发布于 2010-06-13 06:12:59
不,没有可移植的方法可以做到这一点。话又说回来,根本没有可移植的方法来使用#杂注。正因为如此,许多C/C++编译器都定义了自己的方法来做杂注之类的事情,这些方法通常可以嵌入到宏中,但是您需要在每个编译器上使用不同的宏定义。如果你愿意走这条路,你通常会做这样的事情:
#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,将属性作为附录添加到类型签名中,而另一些编译器,如MSC,将其添加为前缀(或者至少有一次,我已经多年没有使用MSC了)。使用括号结构允许您定义一些始终有效的东西,即使您必须将整个类型签名传递到编译器构造中。
当然,如果您尝试将其移植到没有您想要的属性的编译器,那么除了让宏展开为空,并希望您的代码仍然可以运行之外,您什么也做不了。在纯粹的警告或优化编译指示的情况下,这是可能的。在其他情况下,情况并非如此。
哦,我怀疑您实际上需要将Weak_b和Weak_e定义为带有参数的宏,但是我不愿意通读文档来了解如何仅为这个示例创建弱定义。我把它留给读者作为练习。
https://stackoverflow.com/questions/3030099
复制相似问题