首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确地打印__FILE__扩展到的字符串?

如何正确地打印__FILE__扩展到的字符串?
EN

Stack Overflow用户
提问于 2010-07-20 14:32:21
回答 5查看 5.3K关注 0票数 11

考虑一下这个项目:

代码语言:javascript
运行
复制
#include <stdio.h>
int main() {
    printf("%s\n", __FILE__);
    return 0;
}

根据文件的名称,这个程序可以工作--或者不工作。我面临的问题是,我想以一种编码安全的方式打印当前文件的名称。但是,如果文件中有无法在当前代码页中表示的有趣字符,编译器将产生警告(这是正确的):

代码语言:javascript
运行
复制
?????????.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)表示形式存储在源代码中?

我的真实生活用例:我有一个宏,它跟踪当前程序的执行情况,将当前的源代码/行号信息写入一个文件。看起来是这样的:

代码语言:javascript
运行
复制
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__ );

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-20 14:58:21

Use可以使用令牌粘贴操作符,如下所示:

代码语言:javascript
运行
复制
#define WIDEN2(x) L ## x
#define WIDEN(x) WIDEN2(x)
#define WFILE WIDEN(__FILE__)

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

Stack Overflow用户

发布于 2010-07-20 19:59:28

__FILE__将始终扩展为字符串文本,因此本质上它将与char const*兼容。这意味着编译器实现除了使用源文件名的原始字节表示形式之外别无选择,因为它在编译时显示自己。

不管这在当前区域设置中是否合理,只要您的运行时系统和编译器接受它为一个有效的文件名,您就可以有一个基本上包含垃圾的源文件名。

如果您作为一个用户,具有与您的文件系统中使用的编码不同的区域设置,您将看到大量的?或者相似。

但是,如果您的两个地区都同意编码,那么普通的printf就足够了,并且您的终端(或您用来查看输出的任何东西)应该能够正确地打印字符。

因此,简单的回答是,只有当系统是一致的w.r.t编码时,它才能工作。否则你运气不好,因为猜测编码是一项相当困难的任务。

票数 1
EN

Stack Overflow用户

发布于 2010-07-20 14:42:17

至于编码,我猜这是文件系统所使用的,可能是Unicode。

至于处理它,修改一下代码如何:

代码语言:javascript
运行
复制
#define TRACE_BEACON activeLogFile()->write( FixThisString(__FILE__ )); 

std::string FixThisString(wchar_t* bad_string) { .....}

( FixThisString的实现是留给学生的练习。)

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3291047

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档