防止或生成自定义弃用的警告

时间:2014-05-31 09:53:27

标签: c++ visual-studio gcc c++11 cross-platform

我正在使用C ++ 11的static_assert来执行编译时检查以防止使用不安全的函数,和/或在应该使用新功能和相关API时向用户提供反馈已过时(例如使用std::strftimestd::to_string等。)

如果任何源代码试图使用过时的函数,我想强制失败,但我需要它完全是跨平台的,并且还绕过或解决其他'助手',例如微软自己的弃用。

我看到我在使用gnu工具链时可以使用.sections,我可以在OpenBSD的cdefs.h(http://ninjalj.blogspot.co.uk/2011/11/your-own-linker-warnings-using-gnu.html)中看到它的定义,但我没有与Visual Studio等效的东西。

例如,我可以毫无问题地使用以下代码来阻止strcpy / strcat

#   define COMPILE_TIME_CHECK(expression, message)      static_assert(expression, message)
#   define GUARANTEE_FAILURE            (0 == 1)
#   define DISABLED_FUNCTIONS_MESSAGE_CSTRING   "strcpy, strcat must be replaced with strlcpy and strlcat, respectively"
#   define strcat       COMPILE_TIME_CHECK(GUARANTEE_FAILURE, DISABLED_FUNCTIONS_MESSAGE_CSTRING);

它可能是不洁净但有效;但问题是当试图对那些不能很好玩的人做同样的事情时,例如ctimelocaltime

_CRT_INSECURE_DEPRECATE(localtime_s) static __inline struct tm * __CRTDECL localtime(const time_t * _Time)

1>c:\program files (x86)\microsoft visual studio 12.0\vc\include\time.inl(86): error C2059: syntax error : 'static_assert'

有没有办法可以阻止特定的功能(警告或编译失败),同时提供一个消息来说明在他们的位置使用什么,而不会以合适的方式与gcc / visual studio发生冲突? Visual Studio中的CRT宏不会阻止上述定义的上述错误。

我不相信像__declspec(deprecated) int strcpy(char*,char*);这样的东西(如此处所说:C++ mark as deprecated)总会打球,而且工作量更大。描述性不如仅仅为函数名设置定义。

1 个答案:

答案 0 :(得分:0)

你可以使用Disable:warning {#warning Code}