gpt4 book ai didi

c++ - 您可以在编译时将 __func__ 转换为 wchar_t[] 吗?

转载 作者:可可西里 更新时间:2023-11-01 17:59:13 26 4
gpt4 key购买 nike

所以我有这段代码

wchar_t funcName[] = __FUNCTIONW__;

但是 __FUNCTIONW__ 的问题是它的名称中包含类信息,而我只需要函数名称。现在 __FUNCTIONW__ 只调用了 _CRT_WIDE(__FUNCTION__) 这让我觉得我可以调用 _CRT_WIDE(__func__) 但这给出了一个错误“identifier L__func__ is undefined "

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

The identifier __func__ is implicitly declared by the translator as if, immediately following the opening brace of each function definition, the declaration

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

appeared, where function-name is the name of the lexically-enclosing function. This name is the unadorned name of the function.

我的意思是 __func_ 不是宏,它与预处理无关?

还有其他方法可以在编译时获取 wchar_t 数组吗?

最佳答案

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

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

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

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[]。另一方面,您应该能够在许多地方使用普通的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com