您能在编译时将__func_转换为wchar_t[]吗
Can you convert __func__ to a wchar_t[] at compile time?
所以我有这段代码
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;
}
给它们(模板+宏)一个最适合你的名字。。。
- 无法将参数 1 从 WCHAR 转换为常量字符 *
- 如何将CString转换为使用WCHAR的Windows API和自定义函数?
- VC++ 2017 如何将常量wchar_t转换为 WCHAR *.
- 将WCHAR转换为LPCTSTR
- 在C++中读取和写入Windows注册表(如何将字符串转换为wchar(?))
- 在 unicode 中将 WCHAR 数组转换为 std::string?
- 将const wchar_t*转换为wchar*
- 将字符从 fget 转换为 Wchar*
- 如何在 iOS 中将 UTF-8 字符串转换为 wchar
- 如何将const char*转换为const WCHAR*
- 如何将wchar_t(或wchar_t*或CORBA::WChar*)转换为字符串
- 如何将strncpy()转换为WCHAR
- 通过COM将C#字符串转换为C++WCHAR*
- 将wchar转换为字符串并推入矢量(C/C++)
- 将 WCHAR[260] 转换为 std::string
- 如何在C++中将WCHAR*转换为字符串,反之亦然
- "strcpy":无法将参数 2 从"WCHAR *"转换为"常量字符 *
- 在Qt中将WCHAR转换为QString
- 如何将WCHAR转换为CString
- C++:将WCHAR转换为LPCWSTR - 实际工作示例