首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >定义宏中的语法化

定义宏中的语法化
EN

Stack Overflow用户
提问于 2010-06-13 05:09:19
回答 3查看 45.9K关注 0票数 109

有没有办法在宏中嵌入杂注语句和其他语句?

我正在尝试实现一些类似的东西:

代码语言:javascript
复制
#define DEFINE_DELETE_OBJECT(type)                      \
    void delete_ ## type_(int handle);                  \
    void delete_ ## type(int handle);                                                \
    #pragma weak delete_ ## type_ = delete_ ## type

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-06-13 06:22:28

如果使用的是c99或c++0x,则有杂注运算符,用作

代码语言:javascript
复制
_Pragma("argument")

这相当于

代码语言:javascript
复制
#pragma argument

除非它可以在宏中使用(参见c99标准的6.10.9节,或c++0x最终委员会草案的16.9节)

例如,

代码语言:javascript
复制
#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中时,它会给出

代码语言:javascript
复制
void delete_foo_(int handle); void delete_foo(int handle);
#pragma weak delete_foo_ = delete_foo
 ;
票数 126
EN

Stack Overflow用户

发布于 2012-02-28 23:34:33

使用_Pragma(“参数”)可以做的一件好事就是使用它来处理一些编译器问题,比如

代码语言:javascript
复制
#ifdef _MSC_VER
#define DUMMY_PRAGMA _Pragma("argument")
#else
#define DUMMY_PRAGMA _Pragma("alt argument")
#endif
票数 5
EN

Stack Overflow用户

发布于 2010-06-13 06:12:59

不,没有可移植的方法可以做到这一点。话又说回来,根本没有可移植的方法来使用#杂注。正因为如此,许多C/C++编译器都定义了自己的方法来做杂注之类的事情,这些方法通常可以嵌入到宏中,但是您需要在每个编译器上使用不同的宏定义。如果你愿意走这条路,你通常会做这样的事情:

代码语言:javascript
复制
#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定义为带有参数的宏,但是我不愿意通读文档来了解如何仅为这个示例创建弱定义。我把它留给读者作为练习。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3030099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档