所以我有这段代码

wchar_t funcName[] = __FUNCTIONW__;

但是__FUNCTIONW__的问题在于,当我想要的只是函数名称时,它的名称中包含类信息。现在__FUNCTIONW__只是调用_CRT_WIDE(__FUNCTION__),这使我认为我可以调用_CRT_WIDE(__func__),但出现错误“标识符L__func__未定义”。
__func__是一个隐式声明的标识符,当在函数内部使用该标识符时,它将扩展为包含函数名称的字符数组变量。它已添加到C99中的C中。从C99§6.4.2.2/1:



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

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

最佳答案

正如您已经引用了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(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"%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;
}

给他们(模板+宏)最合适的名称...

关于c++ - 您可以在编译时将__func__转换为wchar_t []吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38466608/

10-10 14:19