C预处理器如何将函数宏视为字符串

时间:2016-09-22 08:12:56

标签: c++ c-preprocessor

我正在使用mingw在OSX for Windows上编译C ++代码。 C ++代码是自动生成的,包含特定于Visual Studio的代码:

class __declspec(novtable) SomeClass

编译时,我收到很多警告:

warning: ‘novtable’ attribute directive ignored [-Wattributes]

我想抑制这些警告。 Mingw不支持-Wno-microsoft选项,所以我认为我可能会将__declspec(notable)视为指向空字符串的标识符并让预处理器将其删除。

#define __declspec(novtable) 

但是,这被视为__declspec()宏的重新定义,这不是理想的行为。

有没有办法让预处理器将__declspec(novtable)视为标识符,或以其他方式抑制此警告? (违规的自动生成代码无法修改)。

2 个答案:

答案 0 :(得分:2)

据推测,编译器实际上有这个定义

#define __declspec(x) __attribute__((x))

还会识别某些(并非所有)Microsoft特定属性,例如dllexportdllimport。如果上述假设成立,以下内容才有意义。

您可以使用

 #undef __declspec // to suppress a meessage about macro redefinition
 #define __declspec(x) // nothing

(可能适当#ifdef以便不破坏与MSVC的兼容性。

这将取消整个__declspec功能,而不仅仅是__declspec(novtable)。如果这不是您所需要的,请继续阅读。

如果您只需要杀死__declspec(novtable)并保留所有其他属性,请尝试使用

#define novtable // nothing

__attribute__指令可能包含可能为空的属性列表,因此__declspec(novtable)可能会转换为__attribute__(()),这是完全正常的。这也会杀死标识符novtable的所有其他事件。如果它确实发生在任何其他情况下,这不太可能但可能,此选项将不适用于您。

另一种可能性是接管整个功能。

#undef __declspec
#define __declspec(x) my_attribute_ # x

#define my_attribute_dllexport __attribute__((dllexport)) // or whatever you need
#define my_attribute_dllimport __attribute__((dllimport)) // or whatever you need
// ... same for all attributes you do need

#define my_attribute_novtable // nothing
// ... same for all attributes you don't need

答案 1 :(得分:2)

使用一些宏定义__declspec(novtable)

 #define DECL_SPEC __declspec(novtable)  

之后你可以用它作为:

 class DECL_SPEC SomeClass 

并在需要时将DECL_SPEC重新定义为空:

 #ifdef __MINGW32__
 #define DECL_SPEC
 #else
 #define DECL_SPEC __declspec(novtable)
 #endif