我正在使用C ++ 11的static_assert
来执行编译时检查以防止使用不安全的函数,和/或在应该使用新功能和相关API时向用户提供反馈已过时(例如使用std::strftime
,std::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);
它可能是不洁净但有效;但问题是当试图对那些不能很好玩的人做同样的事情时,例如ctime
和localtime
:
_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)总会打球,而且工作量更大。描述性不如仅仅为函数名设置定义。
答案 0 :(得分:0)
你可以使用Disable:warning {#warning Code}