2

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

我的.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 时,出现此错误:

标识符“L__FUNCTION__”未定义。

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

4

3 回答 3

1

您列出的错误是这样的:

identifier "L__FUNCTION__" is undefined.

请注意,它是说“ L__FUNCTION__”未定义,而不是“ __FUNCTION__”。

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

ETA:我还注意到,您没有将该字符串分配给任何东西或以f().

于 2014-05-05T21:49:55.613 回答
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,则将其视为与另一个操作数具有相同编码前缀的字符串文字。如果 UTF-8 字符串文字标记与宽字符串文字标记相邻,则程序格式错误。任何其他连接都由实现定义的行为有条件地支持。

于 2014-05-05T22:33:24.393 回答
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 一样)可以工作,但你没有使用那个版本。

于 2014-05-05T22:36:29.427 回答