我正在使用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)
视为标识符,或以其他方式抑制此警告? (违规的自动生成代码无法修改)。
答案 0 :(得分:2)
据推测,编译器实际上有这个定义
#define __declspec(x) __attribute__((x))
还会识别某些(并非所有)Microsoft特定属性,例如dllexport
和dllimport
。如果上述假设成立,以下内容才有意义。
您可以使用
#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