【问题标题】:Can you convert __func__ to a wchar_t[] at compile time?您可以在编译时将 __func__ 转换为 wchar_t[] 吗?
【发布时间】:2016-07-19 19:06:28
【问题描述】:

所以我有这个sn-p的代码

wchar_t funcName[] = __FUNCTIONW__;

但是__FUNCTIONW__ 的问题是它的名称中包含类信息,而我想要的只是函数名称。 Now__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 数组吗?

【问题讨论】:

  • 正确,__func__ 不是宏,所以在它前面加上一个L,因为_CRT_WIDE 宏确实会导致错误。
  • 出于同样的原因,您不能进行字符串连接 à la "Hello, my name is " __func__ "."...

标签: c++ visual-c++


【解决方案1】:

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

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

您现在遇到的问题就像您想在编译时转换任意其他数组一样,例如。 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[],抱歉。另一方面,您应该能够在许多地方使用普通的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;
}

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

【讨论】:

  • 哇,利用函数内部的静态 var decls 非常聪明。同样在我的工作中,我使用 std::wstring_convert<:codecvt_utf8_utf16>> 转换器转换为 wstring,然后转换为 wchar_t*; std::wstring ws_func = converter.from_bytes(_ func _);只提到最后一部分 b\c 我想知道如果我只使用 std::wstring 和 std::wstring_convert 上的实用程序,是否需要结构和模板
  • 另一种方法,但这样做:static std::wstring ws_func(std::wstring_convert&lt;std::codecvt_utf8_utf16&lt;wchar_t&gt;&gt;().from_bytes(__func__)); 作为静态,它只构造一次。转换器,因为只在 wstring 的 ctor 中使用,也只构造一次。这种方式不需要模板或普通结构。
  • 有一个更简单的方法。什么适用于文件(stackoverflow.com/a/14421702/2532437),也适用于功能。这使得编译器可以做到这一点。甚至没有一次运行时调用 mbstowcs。
  • @BenKey ,而 _T(__FUNCTION_) 工作正常(__FUNCTION__ 是 MSVC 特定的),同样的方法不适用于 __func__
猜你喜欢
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多