你能在编译时将__func__转换为wchar_t []吗?

时间:2016-07-19 19:06:28

标签: c++ visual-c++

所以我有这段代码

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";
     

出现,其中function-name是词法封闭函数的名称。这个名字是函数的简单名称。

我认为__func_不是宏,它与预处理无关?

还有另一种方法可以在编译时获取wchar_t数组吗?

1 个答案:

答案 0 :(得分:1)

正如你已经引用了C标准(实际上,它是不好的,你需要C ++标准,但是你会发现相同的......):

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

你现在遇到了同样的问题,就好像你想在编译时转换任意其他数组一样,e。 G:

char buffer[16];
// convert to wchar_t[16]?

int array[4];
// convert to double[4]?

数组类型为int[4]。那是修复。它占用内存中的4 * sizeof(int)字节,对于现在的大多数机器来说通常是16字节,你不能神奇地改变为4 * sizeof(双)字节,通常是32字节(这将是获得内存的一个很好的技巧)免费升级......)。

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

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

问题在于接受e的功能。 G。 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;
}

给他们(模板+宏)任何最适合你的名字......