考虑这个程序:
#include <stdio.h>
int main() {
printf("%s\n", __FILE__);
return 0;
}
该程序是否有效取决于文件的名称。我面临的问题是我想以编码安全的方式打印当前文件的名称。但是,如果文件包含当前代码页无法表示的有趣字符,编译器会发出警告(理所当然):
?????????.c(3) : warning C4566: character represented by universal-character-name '\u043F' cannot be represented in the current code page (1252)
我该如何解决这个问题?我想存储给出的字符串__FILE__
例如UTF-16,以便我可以在运行时在任何其他系统上正确打印它(通过将存储的 UTF-16 表示转换为运行时系统使用的任何内容)。为此,我需要知道:
- 给出的字符串使用什么编码
__FILE__
?看起来,至少在 Windows 上,使用了当前的系统代码页(在我的例子中为 Windows-1252)——但这只是猜测。这是真的?
- 如何在构建时将该字符串的 UTF-8(或 UTF-16)表示形式存储在源代码中?
我的现实生活用例:我有一个跟踪当前程序执行的宏,将当前源代码/行号信息写入文件。它看起来像这样:
struct LogFile {
// Write message to file. The file should contain the UTF-8 encoded data!
void writeMessage( const std::string &msg );
};
// Global function which returns a pointer to the 'active' log file.
LogFile *activeLogFile();
#define TRACE_BEACON activeLogFile()->write( __FILE__ );
如果当前源文件的名称包含当前代码页无法表示的字符,则会中断。
使用可以使用令牌粘贴运算符,如下所示:
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define WFILE WIDEN(__FILE__)
int main() {
wprintf("%s\n", WFILE);
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)