为什么__FUNCTION__未定义?

时间:2014-05-05 21:34:03

标签: c++ visual-c++ macros predefined-macro

我有一个C ++库,它使用预定义的宏__FUNCTION__,通过crtdefs.h。该宏记录为here。这是我的用法:

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应用程序。

当我编译lib时,我收到此错误:

  

标识符&#34; L__FUNCTION __&#34;未定义。

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

3 个答案:

答案 0 :(得分:1)

您将错误列为:

identifier "L__FUNCTION__" is undefined.

请注意它&#34; L__FUNCTION__&#34;没有定义,不是&#34; __FUNCTION__&#34;。

不要在代码中使用__FUNCTIONW__。 MS没有记录您链接的页面,他们记录了__FUNCTION__。而且你不需要扩大__FUNCTION__

ETA:我还注意到您并未将该字符串分配给任何内容或在f()中以任何方式打印它。

答案 1 :(得分:0)

只需使用

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

当相邻的字符串文字组合在一起时,如果有任何组件,结果将是一个宽字符串。

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


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

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

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


规则见2.14.5p13:

  

在翻译阶段6(2.2)中,连接相邻的字符串文字。如果两个字符串文字具有相同的 encoding-prefix ,则生成的连接字符串文字具有 encoding-prefix 如果一个字符串文字没有 encoding-prefix ,则将其视为与另一个操作数相同的 encoding-prefix 的字符串文字。如果UTF-8字符串文字标记与宽字符串文字标记相邻,则程序格式错误。任何其他连接都是通过实现定义的行为有条件地支持的。

答案 2 :(得分:0)

我认为__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一样),这可能有用,但你没有使用那个版本。