所以我有这段代码
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/