C ++标记为已弃用

我有一个接口,我想用可移植的C + +弃用方法。 当我谷歌search这一切只是一个微软的具体解决scheme; 已弃用#pragma和__declspec(不build议使用) 。

二等奖解决scheme将是如果MSVC和GCC解决scheme。
谢谢

这应该做的伎俩:

#ifdef __GNUC__ #define DEPRECATED(func) func __attribute__ ((deprecated)) #elif defined(_MSC_VER) #define DEPRECATED(func) __declspec(deprecated) func #else #pragma message("WARNING: You need to implement DEPRECATED for this compiler") #define DEPRECATED(func) func #endif ... //don't use me any more DEPRECATED(void OldFunc(int a, float b)); //use me instead void NewFunc(int a, double b); 

但是,如果函数返回types的名称中包含逗号,例如std::pair<int, int> ,则会由于预处理器将其解释为将2个parameter passing给DEPRECATEDmacros而遇到问题。 在这种情况下,你将不得不input返回types。

编辑: 在这里更简单(但可能不太广泛兼容)的版本。

在C ++ 14中,可以使用[[deprecated]]属性将函数标记为已[[deprecated]] (请参阅第7.6.5节[dcl.attr.deprecated])。

deprecated属性标记可以用来标记名称和实体的使用仍然允许,但由于某种原因不鼓励。

例如,下面的函数foo被弃用:

 [[deprecated]] void foo(int); 

可以提供描述名称或实体为什么被弃用的消息:

 [[deprecated("Replaced by bar, which has an improved interface")]] void foo(int); 

该消息必须是string文字。

有关更多详细信息,请参阅“在C ++ 14中标记为已弃用” 。

这是我2008年答案的简化版本:

 #ifdef __GNUC__ #define DEPRECATED __attribute__((deprecated)) #elif defined(_MSC_VER) #define DEPRECATED __declspec(deprecated) #else #pragma message("WARNING: You need to implement DEPRECATED for this compiler") #define DEPRECATED #endif //... //don't use me any more DEPRECATED void OldFunc(int a, float b); //use me instead void NewFunc(int a, double b); 

在GCC中,你可以声明你的函数的属性不赞成像这样:

 void myfunc() __attribute__ ((deprecated)); 

这将在.c文件中使用该函数时触发编译时警告。

您可以在http://gcc.gnu.org/onlinedocs/gcc/Pragmas.html上的; “Diagnostic pragmas”中find更多信息。

处理便携式项目几乎是不可避免的,在某些时候,您需要一系列预处理的替代品来适应各种平台。 #ifdef这个#ifdef等等。

在这样的章节中,您可以很有条件地定义一种方法来废弃符号。 我的首选通常是定义一个“警告”macros,因为大多数工具链都支持自定义的编译器警告。 然后,您可以继续使用特定的警告macros进行弃用等。对于支持专用弃用方法的平台,您可以使用该macros而不是警告。