有没有办法在宏中使用其他语句嵌入pragma语句?
我正在努力实现以下目标:
#define DEFINE_DELETE_OBJECT(type) \
void delete_ ## type_(int handle); \
void delete_ ## type(int handle); \
#pragma weak delete_ ## type_ = delete_ ## type
如果存在增强解决方案(除了wave之外)我也没关系。
答案 0 :(得分:105)
如果您使用的是c99或c ++ 0x,则有pragma运算符,用作
_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
;
答案 1 :(得分:4)
使用_Pragma(“参数”)可以做的一件好事就是用它来处理一些编译器问题,比如
#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif
答案 2 :(得分:0)
不,没有便携式的方法。然后,根本没有可移植的方法来使用#pragma。因此,许多C / C ++编译器定义了自己的类似pragma的方法,并且它们通常可以嵌入到宏中,但是每个编译器都需要不同的宏定义。如果你愿意走那条路,你经常会做这样的事情:
#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定义为带参数的宏,但是我不愿意阅读文档来了解如何为这个例子创建一个弱定义。我把它作为读者的练习。
答案 3 :(得分:-3)
有没有办法在宏中用其他语句嵌入pragma语句?
不,您不能将预处理程序语句放入预处理程序语句中。但是,您可以将其置于inline
函数中。但是,这会打败C
标签。