c++ - 如何正确打印 __FILE__ 扩展到的字符串?

标签 c++ c unicode winapi

考虑这个程序:

#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 表示形式转换为运行时系统使用的任何形式)。为此,我需要知道:

  1. __FILE__ 给出的字符串使用什么编码?似乎,至少在 Windows 上,使用了当前系统代码页(在我的例子中是 Windows-1252)——但这只是猜测。这是真的吗?
  2. 如何在构建时在我的源代码中存储该字符串的 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__ );

如果当前源文件的名称包含当前代码页无法表示的字符,则会中断。

最佳答案

使用可以使用 token 粘贴运算符,像这样:

#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define WFILE WIDEN(__FILE__)

int main() {
    wprintf("%s\n", WFILE);
    return 0;
}

关于c++ - 如何正确打印 __FILE__ 扩展到的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3291047/

相关文章:

c - 为什么程序没有崩溃?

c - 使用参数在 Netbeans 中运行 C 应用程序

java - Unicode 未在 Java 中进行翻译

c++ - 你如何从 unicode 值中推断出字符集?

c++ - 静态类成员的初始化。为什么要构造函数?

c++ - 请解释这个程序中的>>

c - C 中检查文件是否存在特定扩展名或模式的函数

c++ - 如何使用 c++ 使用 v4l2 API 连续捕获 h264 视频?

c++ - 正确重载 stringbuf 以替换 MATLAB mex 文件中的 cout

c# - 如何通过 GSM 调制解调器使用 AT 命令在 C# 中读取 Unicode 消息(例如波斯语和阿拉伯语)?