为什么__FUNCTION__是undefined ?

Why would __FUNCTION__ be undefined?

本文关键字:undefined FUNCTION 为什么      更新时间:2023-10-16

我有一个c++库,通过crtdefs.h使用预定义的宏__FUNCTION__。这里记录了这个宏。以下是我的用法:

my.cpp

#include <crtdefs.h>
...
void f()
{
    L(__FUNCTIONW__ L" : A diagnostic message");
}
static void L(const wchar_t* format, ...)
{
    const size_t BUFFERLENGTH = 1024;
    wchar_t buf[BUFFERLENGTH] = { 0 };
    va_list args;
    va_start(args, format);
    int count = _vsnwprintf_s(buf, BUFFERLENGTH, _TRUNCATE, format, args);
    va_end(args);
    if (count != 0)
    {
        OutputDebugString(buf);
    }
}

crtdefs.h

#define __FUNCTIONW__ _STR2WSTR(__FUNCTION__) 

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

当我编译这个库时,我得到这个错误:

标识符"L__FUNCTION__"未定义。

根据文档,如果/p或/EP传递给编译器,宏不会展开。我已经证实他们不是。是否有其他情况下该宏不可用?

您列出的错误如下:

identifier "L__FUNCTION__" is undefined.

注意这里没有定义" L__FUNCTION__ ",而不是" __FUNCTION__ "。

不要在代码中使用__FUNCTIONW__。微软没有在你链接的页面中记录这些,他们记录了__FUNCTION__。你不需要加宽__FUNCTION__

ETA:我还注意到,您没有将该字符串分配给任何东西或在f()中以任何方式打印它。

就用

L(__FUNCTION__    L" : A diagnostic message");

当相邻的字符串字面值组合在一起时,如果其中任何一个组件是。

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


因为你的L函数包装了vsprintf,你也可以使用:

L(L"%hs : A diagnostic message", __func__);

由于__func__被标准化为窄字符串,因此%hs格式说明符是合适的。


该规则见于2.14.5p13:

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

我认为__FUNCTIONW__的定义是不正确的。(我知道这不是你写的。)

从:http://gcc.gnu.org/onlinedocs/gcc/Function-Names.html

这些标识符不是预处理器宏。在GCC 3.3及更早的版本中,仅在C语言中,__FUNCTION____PRETTY_FUNCTION__被视为字符串文字;它们可以用来初始化char数组,它们可以与其他字符串字面值连接。GCC 3.4及以后的版本它们作为变量,如__func__。在c++中,__FUNCTION____PRETTY_FUNCTION__一直是变量

至少在当前的GCC中,你不能将L添加到__FUNCTION__中,因为这就像试图将L添加到变量中一样。可能有一个版本的vc++(就像GCC一样)可以工作,但是你没有使用那个版本。