您能在编译时将__func_转换为wchar_t[]吗

Can you convert __func__ to a wchar_t[] at compile time?

本文关键字:wchar 转换 func 编译      更新时间:2023-10-16

所以我有这段代码

wchar_t funcName[] = __FUNCTIONW__;

__FUNCTIONW__的问题是它的名称中有类信息,而我只想要函数名。现在__FUNCTIONW__只调用_CRT_WIDE(__FUNCTION__),这让我认为我可以调用_CRT_WIDE(__func__),但这给出了一个错误"标识符L_func_未定义"

__func__是一个隐式声明的标识符,当在函数内部使用时,它会扩展为包含函数名称的字符数组变量。它被添加到C99的C中。来自C99§6.4.2.2/1:

标识符__func__由翻译器隐式声明,就好像紧接在每个函数定义的大括号后面的声明

static const char __func__[] = "function-name";

出现,其中函数名称是词汇封闭函数的名称。此名称是函数的未修饰名称。

我认为这意味着__func_不是一个宏,它与预处理无关?

有没有其他方法可以在编译时获得wchar_t数组?

正如您已经引用了C标准(实际上,这是一个糟糕的标准,您需要C++标准,但在那里您可以找到相同的…):

static const char __func__[] = "function-name";

现在,如果您想在编译时转换任意其他数组,您会遇到同样的问题,例如:

char buffer[16];
// convert to wchar_t[16]?
int array[4];
// convert to double[4]?

数组类型为int[4]。这就是解决办法。它在内存中占据4*sizeof(int)字节,对于现在的大多数机器来说,通常是16字节,你不能神奇地将其更改为4*sizeof(double)字节,通常是32字节(免费升级内存是个不错的技巧…)

抱歉,无法在编译时将char const __func__[]更改为wchar_t[]。另一方面,您应该能够在许多使用wchar_t数组(数组,而不是宽字符串文字!)的地方使用普通的char const数组__func__

std::wofstream ws; ws << __func__;
wchar_t buffer[64]; swprintf(buffer, sizeof(buffer), L"%sn", __func__);

问题是函数接受例如wchar_t*,而没有char*重载。然后,您将无法在运行时转换字符串(请参阅mbstowcs)。

如果有帮助的话,这可能是一个如何方便地为每个功能只做一次的想法:

template <size_t N>
struct F
{
    wchar_t name[N];
    F(char const* func)
    {
        mbstowcs(name, func, N);
    }
};
#define F_INIT static F<sizeof(__func__)> func(__func__)
#define FUNC func.name
void foo()
{
    F_INIT;
    std::wcout << FUNC;
}
int main(int argc, char* argv[])
{
    F_INIT;
    std::wcout << FUNC;
    return 0;
}

给它们(模板+宏)一个最适合你的名字。。。