这个问题特定于 Visual C++(您可以假设 Visual C++ 2005 及更高版本)。
我想为来自 unixoid 系统(特别是 FreeBSD)的程序创建粘合代码,以便在 Win32 上构建和运行,而对原始.c
文件的更改最少。现在,大部分内容都很简单,但现在我遇到了一个问题。我正在使用tchar.h
标头和TCHAR
/ _TCHAR
,并且需要在原始代码中为err
anderrx
调用创建粘合代码(请参阅 参考资料)。err(3)
请耐心等待,即使您不同意tchar.h
仍应编写代码 using。
调用err
和errx
大致采取两种形式,这就是问题发生的地方:
err(1, "some string with %d format specifiers and %s such", ...)
/* or */
err(1, NULL, ...)
后者将输出存储在errno
(使用strerror
)中的错误。
现在,问题是,有没有办法编写一个可以同时NULL
接受字符串文字的通用宏?我不必(也不会)关心作为第二个参数传递的变量NULL
,只有和文字字符串。
当然,我天真的初始方法没有考虑fmt
传递为NULL
(使用可变参数宏!):
#define err(eval, fmt, ...) my_err(eval, _T(fmt), __VA_ARGS__)
现在我不知道如何使用宏来实现这一点,因为它需要一种我目前无法想象的编译时和运行时条件的混合。因此,我正在寻找一个权威的答案,无论这是否可以想象。
我现在采用的方法 - 缺乏更好的方法 - 是编写一个接受的包装函数,就像err
and errx
, a ( const
)char *
然后将其转换为wchar_t *
if 编译时_UNICODE
定义。这应该可以工作,假设调用者在后面传递了一个_TCHAR*
变量参数的字符串fmt
(在我的上下文中这是一个理智的假设)。否则,我还必须转换%s
为%hs
格式字符串内部,以处理 MS 所称的“ANSI”字符串。