Pragma在定义宏

时间:2010-06-12 21:09:19

标签: c-preprocessor pragma stringification

有没有办法在宏中使用其他语句嵌入pragma语句?

我正在努力实现以下目标:

#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type_(int handle);                  \
    void delete_ ## type(int handle);                                                \
    #pragma weak delete_ ## type_ = delete_ ## type

如果存在增强解决方案(除了wave之外)我也没关系。

4 个答案:

答案 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_bWeak_e定义为开始和结束包围结构,因为像GCC这样的一些编译器将属性添加为类型签名的附录,有些,像MSC一样将它添加为前缀(或者至少它曾经做过一次,这是自从我使用MSC以来的几年)。使用包围结构允许您定义始终有效的内容,即使您必须将整个类型签名传递到编译器结构中。

当然,如果您尝试将其移植到没有您想要的属性的编译器,那么您无法做任何事情,只需将宏扩展为空,并希望您的代码仍然运行。如果纯粹警告或优化编译指示,这很可能。在其他情况下,不是那么多。

哦,我怀疑你实际上需要将Weak_b和Weak_e定义为带参数的宏,但是我不愿意阅读文档来了解如何为这个例子创建一个弱定义。我把它作为读者的练习。

答案 3 :(得分:-3)

  

有没有办法在宏中用其他语句嵌入pragma语句?

不,您不能将预处理程序语句放入预处理程序语句中。但是,您可以将其置于inline函数中。但是,这会打败C标签。