gpt4 book ai didi

c - Linux 中 __FUNCTION__ 的加宽版本

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:14:08 26 4
gpt4 key购买 nike

我尝试编写一个宽版本的__FUNCTION__ 来支持可移植代码(Windows 和Linux)

#include <stdio.h>
#include <wchar.h>
#include <errno.h>

typedef wchar_t WCHAR;
typedef const wchar_t * PCWCH;
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#ifdef _WIN32
#define __WFUNCTION__ WIDEN(__FUNCTION__) L"(): "
#elif __linux__
#define MAX_FUNC_NAME_SIZE 1024
WCHAR func_name[MAX_FUNC_NAME_SIZE];
#define __WFUNCTION__ \
(AsciiStrToUnicodeStr(__FUNCTION__, func_name, MAX_FUNC_NAME_SIZE) == 0) ? func_name : L"(): "
#endif


int AsciiStrToUnicodeStr(const char *src, WCHAR *destination, unsigned int dest_max)
{
size_t retval;
if (!src || !destination || (dest_max == 0)) {
return -EINVAL;
}
retval = mbstowcs(destination, src, dest_max);
return (retval == -1) ? retval : 0;
}

void DbgTrace(PCWCH pwcFormat,...)
{

wprintf(L"%ls\n", pwcFormat);

}

void test()
{

DbgTrace(__WFUNCTION__ L"ERROR: Null string passed\r\n");
}

int main()
{
DbgTrace(__WFUNCTION__ L"ERROR: Null string passed\r\n");
test();
}

输出仅包含函数名称,但不包含连接字符串。

上面的代码有什么错误。

预处理器的添加输出:

void test()
{

DbgTrace((AsciiStrToUnicodeStr(__FUNCTION__, func_name, 1024) == 0) ? func_name : L"(): " L"ERROR: Null string passed\r\n");
}

最佳答案

__FUNCTION__(在 C99 中应拼写为 __func__)不是字符串文字;它实际上是一个隐式定义的字符数组。因此,您不能通过文字串联从中创建字符串文字。 (至少,不是在标准 C 中。MSVC 可能会将 __FUNCTION__ 视为字符串文字,但它不可移植。)

字符串文字拼接是在预处理后立即完成的,只能应用于字符串文字,不适用于变量。 func_name "extra text" 将是一个语法错误。

但正如您所见,这并不是宏展开式产生的结果。连接的文字是 L"(): "和 L"error: NULL string passed"。

请注意,如果 __func__ 是一个字符串文字,您可以将它变成一个带有字符串连接的宽字符串文字。例如:

L"" __FILE__ ": the file"

是一个有效的宽字符串文字。 (但它不适用于 Windows。请参阅 https://stackoverflow.com/a/21789691/1566221)。

由于 __func__ 不是字符串文字,因此无法在预处理器中扩展它。 (也不将其转换为宽字符串)。最好的办法是在 printf 调用(或 wprintf)中单独使用它:

 printf("%s %s, funcname, message);

关于c - Linux 中 __FUNCTION__ 的加宽版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55918730/

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