Visual Studio 2017中VC++使用__PRETTY_FUNCTION__编译报错,如何解决?
在Visual Studio 2017 (15.5.6)的Visual C++中使用
__PRETTY_FUNCTION__的解决方案 为什么会出现「提示正常但编译报错」的情况?
这是因为Visual Studio的**IntelliSense(智能代码提示工具)**为了兼容主流编译器的常用宏,会把GCC的__PRETTY_FUNCTION__加入到提示列表中,甚至能模拟显示它的预期值。但实际负责编译代码的MSVC编译器本身并不原生支持这个宏,所以编译阶段就会抛出错误——简单说就是「提示工具和实际编译器的规则没对齐」,这种情况在跨编译器兼容场景里挺常见的。
让__PRETTY_FUNCTION__正常工作的解决方案
MSVC有自己的等效宏,你可以通过以下两种方式解决:
直接使用MSVC原生宏
__FUNCSIG__
这个宏是MSVC原生支持的,功能和__PRETTY_FUNCTION__类似,会输出函数的完整签名。比如:#include <iostream> void testFunction(int param) { std::cout << __FUNCSIG__ << std::endl; }编译运行后会输出类似:
void __cdecl testFunction(int)的内容。定义兼容宏实现跨平台适配
如果你希望代码同时兼容GCC和MSVC,不想修改原有代码里的__PRETTY_FUNCTION__,可以在代码开头添加宏定义:#ifdef _MSC_VER // 在MSVC环境下将__PRETTY_FUNCTION__映射到__FUNCSIG__ #define __PRETTY_FUNCTION__ __FUNCSIG__ #endif这样原有的
__PRETTY_FUNCTION__代码在MSVC里会被替换成__FUNCSIG__,编译就能正常通过,同时在GCC环境下依然使用原生的__PRETTY_FUNCTION__。
额外说明
在你使用的VS2017 15.5.6版本中,MSVC并没有原生支持__PRETTY_FUNCTION__,所以必须通过上述宏替换的方式解决。后续的VS2019及更高版本对GCC宏的兼容性有所提升,但针对当前版本,这是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Adam Badura
相关产品推荐
相关产品推荐

