不,没有便携的方法可以做到这一点。再说一次,根本没有可移植的方式来使用#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 定义为带有参数的宏,但我不愿意通读文档以了解如何仅为此示例创建弱定义。我把它留给读者作为练习。