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而不是警告。