C++ 是否有跨平台的方法来禁用C++;?

C++ 是否有跨平台的方法来禁用C++;?,c++,c++11,C++,C++11,我有一个库,我正在重构一些功能。我用下面定义的itkLegacyMacro标记了一些旧方法。这些不推荐使用的方法是从库自己的单元测试中调用的。有没有一种方法可以禁用可在所有(或至少大多数)编译器中使用的弃用警告 itkLegacyMacro: // Setup compile-time warnings for uses of deprecated methods if // possible on this compiler. #if defined( __GNUC__ ) &&

我有一个库,我正在重构一些功能。我用下面定义的
itkLegacyMacro
标记了一些旧方法。这些不推荐使用的方法是从库自己的单元测试中调用的。有没有一种方法可以禁用可在所有(或至少大多数)编译器中使用的弃用警告

itkLegacyMacro:

// Setup compile-time warnings for uses of deprecated methods if
// possible on this compiler.
#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) && ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) )
#define itkLegacyMacro(method) method __attribute__( ( deprecated ) )
#elif defined( _MSC_VER )
#define itkLegacyMacro(method) __declspec(deprecated) method
#else
#define itkLegacyMacro(method) method
#endif
库中的方法定义:

class X {
itkLegacyMacro(void oldMethod());
void newMethod(); }
从单元测试调用方法:

X testX;
testX.newMethod(); //test the new stuff
testX.oldMethod(); //test the old stuff too!

最后一行导致编译时发出警告。我希望此库能够测试不推荐使用的功能,但在编译时不会出现警告。可能吗?目前正在使用C++11。

据我所知,
\uu declspec(…)
是Microsoft的一个扩展,并且不是跨平台的

你可以用宏来控制它

#ifdef _MSC_VER
#define DEPRECATED __declspec(deprecated)
#else 
#define DEPRECATED
#endif

DEPRECATED void someDeprecatedFunction()
自C++14以来,还有
[[deprecated(“because”)]

要仅在单元测试时关闭它,可以执行以下操作

#ifndef SUPPRESS_DEPRECATE_FUNCTIONS
#define DEPRECATED __declspec(deprecated)
#else
#define DEPRECATED
#endif
然后在单元测试中定义SUPPRESS_DEPRECATE_函数,或者使用
-DSUPPRESS_DEPRECATE_函数
进行编译。或者,您可以在单元测试中创建一个特殊的标题,该标题
#pragma
显示警告抑制。类似于

#if defined( __GNUC__ ) && !defined( __INTEL_COMPILER ) && ( __GNUC__ > 3 || ( __GNUC__ == 3 && __GNUC_MINOR__ >= 1 ) )
#pragma for gcc
#elif defined( _MSC_VER )
#pragma for msvc
#else
// nothing
#endif

#include "your_library_header.h"

然后,单元测试只在任何其他库头之前包含此头。

警告通常是特定于编译器的。在特定的库中,或者对于特定的编译器,或者实际上在标准中,它是“不推荐的”吗?我是一个库维护者,在新版本中,一些方法应该不推荐。我将
\u declspec(已弃用)
附加到它们。有没有办法让库自己的单元测试在编译时不产生警告?我不能肯定地说,但我找不到。尽管您可以尝试在任何make引擎中添加相关的#pragmas或命令行选项,但对于您可以想到的每个编译器,或者添加您自己的预处理器开关,以在某些生成配置中不生成或使用不推荐的函数。什么是
\u declspec
?据我所知,declspec本身不是跨平台的。是的,我阅读了后面对“答案”的评论,但后来没有。很高兴你高兴:-)我现在可以踢自己的腹股沟了。
itkLegacyMacro
已经有了一种禁用警告的方法,方法是使用与建议的
SUPPRESS\u DEPRECATE\u函数类似的机制
\define ITK\u LEGACY\u TEST
。我本可以读到上面几行!