Pragma在定义宏

Any*_*orn 94 pragma stringification c-preprocessor

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

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

#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type_(int handle);                  \
    void delete_ ## type(int handle);                                                \
    #pragma weak delete_ ## type_ = delete_ ## type
Run Code Online (Sandbox Code Playgroud)

如果有的话,我可以使用提升解决方案(除了wave).

Sco*_*les 108

如果您使用的是c99或c ++ 0x,则使用pragma运算符

_Pragma("argument")
Run Code Online (Sandbox Code Playgroud)

这相当于

#pragma argument
Run Code Online (Sandbox Code Playgroud)

除了可以在宏中使用(参见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);
Run Code Online (Sandbox Code Playgroud)

投入时gcc -E给予

void delete_foo_(int handle); void delete_foo(int handle);
#pragma weak delete_foo_ = delete_foo
 ;
Run Code Online (Sandbox Code Playgroud)

  • 作为一个FYI:MSVC有`__pragma()`预处理器运算符,遗憾的是它与C99的`_Pragma()`运算符略有不同(C99采用字符串文字,MSVC采用不在字符串中的标记):http:/ /msdn.microsoft.com/en-us/library/d9x1s805.aspx (31认同)
  • @MichaelBurr MSVC总是要与众不同,不是吗? (14认同)

小智 5

你可以用 _Pragma("argument") 做的一件好事是用它来处理一些编译器问题,比如

#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif
Run Code Online (Sandbox Code Playgroud)