为什么函数是未定义的? 我有一个C++库,它使用预定义的宏函数>代码>,通过CRTDEFS.h。宏被记录下来。以下是我的用法:

为什么函数是未定义的? 我有一个C++库,它使用预定义的宏函数>代码>,通过CRTDEFS.h。宏被记录下来。以下是我的用法:,c++,visual-c++,macros,predefined-macro,C++,Visual C++,Macros,Predefined Macro,my.cpp 该库(编译为静态库,如果需要的话)被同一解决方案中的另一个项目使用,这是一个用C#编写的WPF应用程序 当我编译库时,会出现以下错误: 标识符“L__函数”未定义 根据文档,如果将/p或/EP传递给编译器,则宏不会展开。我已经证实他们不是。是否存在此宏不可用的其他条件 您将错误列为: identifier "L__FUNCTION__" is undefined. 请注意,它的意思是“L\u函数”未定义,而不是“\u函数”” 不要在代码中使用\u函数w\u。MS没有在您链接的页面

my.cpp

该库(编译为静态库,如果需要的话)被同一解决方案中的另一个项目使用,这是一个用C#编写的WPF应用程序

当我编译库时,会出现以下错误:

标识符“L__函数”未定义


根据文档,如果将/p或/EP传递给编译器,则宏不会展开。我已经证实他们不是。是否存在此宏不可用的其他条件

您将错误列为:

identifier "L__FUNCTION__" is undefined.
请注意,它的意思是“
L\u函数”未定义,而不是“
\u函数”

不要在代码中使用
\u函数w\u
。MS没有在您链接的页面中记录这一点,而是记录了
\uuuuu函数\uuuuu
。而且您不需要加宽
\uuuuu函数\uuuu

ETA:我还注意到,在
f()
中,您没有将该字符串分配给任何对象,也没有打印它

只要使用

L(__FUNCTION__    L" : A diagnostic message");
当相邻的字符串文字组合在一起时,如果有任何组件被删除,结果将是一个宽字符串

使用
L
作为函数名没有什么直接的错误。。。然而,这是毫无意义的。好的变量和函数标识符应该是描述性的,以帮助读者理解代码。但是编译器不在乎


由于
L
函数包装了vsprintf,您还可以使用:

L(L"%hs : A diagnostic message", __func__);
由于
\uu func\uu
被标准化为窄字符串,因此
%hs
格式说明符是合适的


规则见2.14.5p13:

在翻译阶段6(2.2),相邻的字符串文字被连接起来。如果两个字符串文字具有相同的编码前缀,则生成的串联字符串文字具有该编码前缀如果一个字符串文字没有编码前缀,它将被视为与另一个操作数具有相同编码前缀的字符串文字。如果UTF-8字符串文字标记与宽字符串文字标记相邻,则程序的格式不正确。任何其他连接都有条件地支持实现定义的行为


我认为
\uuuu函数w\uuuu
的定义不正确。(我知道不是你写的。)

发件人:

这些标识符不是预处理器宏。在GCC 3.3及更早版本中, 仅在C语言中,
\uuuuuuu函数
\uuuuu漂亮的函数
被视为字符串 文字;它们可以用来初始化字符数组,并且可以 可以与其他字符串文字连接。GCC 3.4及更高版本 它们作为变量,如
\uuuu func\uuu
。在C++中,<代码>函数> <代码>
\uuuu PRETTY\u FUNCTION\uuuu
始终是变量


至少在当前的GCC中,您不能将
L
前置到
\uuu函数\uuu
,因为这就像试图将
L
前置到变量一样。可能有一个版本的VC++(就像GCC一样)可以实现这一点,但您没有使用该版本。

重现问题的最低要求是什么?
..
中有什么?这可能不是这里的问题,但是以
\uuuu
开头的符号是为编译器保留的,因此您应该尝试为
\define
找到另一个名称。“…”是类的其余部分,是围绕D3D调试的一组函数。我可以把他们的尸体移走,但什么也没变。真奇怪,这看起来是对的。当通过附加的helper宏的间接寻址不存在时,您得到的错误是常见的,但是如果您显示的定义确实是预处理器使用的定义,那么这不是问题所在。(我已经删除了我以前的评论,很抱歉发出噪音。)您使用的是什么版本?VS2013。我认为错误消息在这里使用的是字符串文字标识符“L”,而不是引用我的同名函数。我将重命名该函数以确认。当L()接受一个wchar时,我正在加宽
函数。宽宏确实没有文档记录,但它与窄宏一起定义,所以我打赌使用它是合法的。尽管如此,我还是会切换到它,并将其转换为一个宽字符串,看看这是否有帮助。我正在打印L()中的扩展值。是的,这就是为什么我把它放在双引号中,作为字符串文本的一部分。不,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。你可以不使用它,直到有一天MS发布了一个编译器+库,它没有定义它,你的代码不再编译。那样的话,/也许/没什么大不了的。在头文件中发现的其他情况下,需要数天的痛苦移植。不要使用没有文档记录的东西。公平点,罗伯。现在使用这个可能是以后的麻烦设置;如果需要的话,最好是自己把狭义的版本扩大。谢谢你在这方面的帮助。好吧,他没有使用g++。但是他的编译器给出了与我从GCC得到的相同的错误消息,所以我认为它在这方面的行为是相同的。检查如何实现
uuu函数
的一种方法是:
#ifdef uuu函数uuu\printf(“它是一个宏”);\#endif
只有当
\uuuuu FUNCTION\uuuu
是fatcat1111编译器中字符串文本的预处理器宏时,这才有效,我认为不是这样。但这确实值得一试@DanielDarabos:可以肯定的是
\uuu func\uu
是一个字符串,特别是一个窄字符串。但是
\uuuu函数\uuuu
可能存在也可能不存在,并且可能是宏或变量。
L(__FUNCTION__    L" : A diagnostic message");
L(L"%hs : A diagnostic message", __func__);