在 C++ 中复制 __PRETTY_FUNCTION__ 的行为
Posted
技术标签:
【中文标题】在 C++ 中复制 __PRETTY_FUNCTION__ 的行为【英文标题】:Replicating the behavior of __PRETTY_FUNCTION__ in C++ 【发布时间】:2019-05-23 21:41:55 【问题描述】:在 GCC 的什么地方定义了 C++ 的 __PRETTY_FUNCTION__
的行为?我想在 Visual Studio 中复制它的功能。
据我了解,我可以 replace __PRETTY_FUNCTION__
with either __FUNCTION__
or __FUNCSIG__
,¹ 但那样的话,我将无法在 macOS 上编译代码。
如何在我希望能够在 Visual Studio 和 Xcode 中编译的代码中包含 __PRETTY_FUNCTION__
的功能。
-
如果我的问题的答案在 the text I’m linking to 或它提到的资源中,我们深表歉意。
【问题讨论】:
所以您想定义__PRETTY_FUNCTION__
以便您的代码在MSVC 上编译,而不是定义__FUNCTION__
以便在MacOS 上编译?
不要说“让它像__PRETTY_FUNCTION__
”,这可能会随着g++版本和平台而改变,你为什么不举个例子来说明你得到了什么以及你想要什么?顺便说一句,__func__
是 __FUNCTION__
的符合标准的名称,Mac 上应该支持它。
“在 GCC 中,C++ 的 __PRETTY_FUNCTION__
的行为在哪里定义?” - 你想知道什么 - 它在源代码中的什么位置,GCC 文档讨论的地方它...?这个问题似乎与您看似的功能要求完全无关,每个人建议的#if
/ #else
per-OS 选择很容易满足这些要求。
@BenVoigt 我正在尝试运行this code,同时提出的问题没有太多具体性,以至于无法在该代码的上下文之外使用答案。在 Visual Studio 中使用 __func__
和在 Xcode 中使用 __FUNCTION__
都没有为我复制 __PRETTY_FUNCTION__
的行为。
@Lucas:当然不是。该代码要求您的编译器生成一个与您设计它的编译器逐字符相同的函数名称,而标准专门将__func__
(和RTTI)生成的名称称为实现定义。使用不同的 gcc 版本时,您的代码甚至可能会中断。
【参考方案1】:
根据您的编译器定义您自己的引用__FUNCTION__
或__PRETTY_FUNCTION__
的宏:
#ifdef _MSC_VER
#define MY_FUNCTION_MACRO __FUNCTION__ // or __FUNCSIG__
#else
#define MY_FUNCTION_MACRO __PRETTY_FUNCTION__
#endif
然后在你的跨平台代码中使用MY_FUNCTION_MACRO
。
请注意,MY_FUNCTION_MACRO
仍会在 VC++ 和 GCC/Clang 之间产生不同的字符串。这是不可避免的,可以让您尽可能接近。
例如:
int main()
std::cout << MY_FUNCTION_MACRO << std::endl;
在 VC++ 中使用__FUNCSIG__
时使用__FUNCTION__
或“int __cdecl main(void)”将产生“main”,而在GCC/Clang 中使用__PRETTY_FUNCTION__
产生“int main()”。
【讨论】:
我认为这接近正确。我想知道为什么(即使在使用您的MY_FUNCTION_MACRO
解决方案并将uint
s 更改为unsigned int
s 之后)main()
in this code 中使用typeStr
模板的每一行的输出仍然输出indeterminate
使用 Visual Studio 运行时。
@Lucas 您链接的代码正在尝试解析__PRETTY_FUNCTION__
的结果字符串。 __FUNCSIG__
会让您在 Visual Studio 中接近,但不会产生完全相同的输出。以上是关于在 C++ 中复制 __PRETTY_FUNCTION__ 的行为的主要内容,如果未能解决你的问题,请参考以下文章
如果我在 C 或 C++ 中执行 `typedef`,我啥时候应该在 typedef'ed 类型的末尾添加 `_t`? [复制]