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

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

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

考虑一下这个项目:

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
?????????.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
代码运行次数:0
运行
AI代码解释
复制
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 06:58:21

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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 11:59:28

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

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

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

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

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

票数 1
EN

Stack Overflow用户

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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

复制
相关文章
如何正确地打印异常堆栈信息
最近老大让我修改项目里所有和log有关的代码,之前我也用过log4j、slf4j或者Logback等日志框架/接口,一直以为打印异常信息就是简单地一句log.info()或者log.error()而已,没想到原来一直都使用错了,以至于有些错误信息没能在log文件中打印出堆栈信息,最终难以定位bug,排查困难。
雨临Lewis
2022/01/11
1.6K0
PHP如何正确地编写事务
我说的事务指的是一般的数据库事务,而不是什么分布式事务之类高大上的概念。听起来很简单,但是即便如此,想实现的优雅一点也不是一件容易的事情。
猿哥
2019/07/25
8170
【说站】python如何打印字符串
2.__repr__应用于所有输出操作,如果有print以及str操作并定义__str__,则会以__str__为准
很酷的站长
2022/11/23
6390
【说站】python如何打印字符串
Java 程序如何正确地打日志
我们 Java 程序员在开发项目时都是依赖 Eclipse/ Idea 等开发工具的 Debug 调试功能来跟踪解决 Bug,在开发环境可以这么做,但项目发布到了测试、生产环境呢?
CSDN技术头条
2018/07/30
8850
Java 程序如何正确地打日志
Java如何正确地输出日志
日常开发日志打印需要注意哪些地方 我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_co
茶半香初
2021/11/26
2.1K0
Java如何正确地输出日志
Java:如何正确地使用异常详解
由于我们开发的项目可不是像写Demo一样轻松,这里可能会有很多层次结构。我们要在具体哪一层的什么位置是使用try-catch这个异常呢,还是把异常throw到上一层呢?这里,我们首先要知道一件事,那就是try-catch和throw分别会发生什么情况呢?
林老师带你学编程
2019/05/25
7240
去掉宏__FILE__的路径
为了不让宏_FILE__带有路径信息,可以在Makefile中重定义宏__FILE_:
coderhuo
2018/08/29
4.1K1
【python】理解 __file__
py3下,__file__返回的是文件的 绝对地址 ; 而在py2下,__file__返回的是文件的 相对地址 。
JNingWei
2020/03/17
6350
干货:如何正确地学习数据科学中的 python
大多数有抱负的数据科学家是通过学习为开发人员开设的编程课程开始认识 python 的,他们也开始解决类似 leetcode 网站上的 python 编程难题。他们认为在开始使用 python 分析数据之前,必须熟悉编程概念。
AI研习社
2019/08/15
1.1K0
干货:如何正确地学习数据科学中的 python
问与答86: 如何正确地统计时间?
Q:我要统计总共花了多少时间,但是求和得到的结果明显不正确,如下图1所示,我怎么样才能得到正确的时间之和?
fanjy
2020/06/09
4750
如何在 Python 中将对象打印为字符串?
在 Python 编程中,有时我们需要将对象转换为字符串格式,以便于打印输出、日志记录或数据存储等操作。Python 提供了多种方法来将对象转换为字符串。本文将详细介绍在 Python 中将对象打印为字符串的几种常用方法,并提供示例代码帮助你理解和应用这些方法。
网络技术联盟站
2023/06/07
1.7K0
干货:如何正确地学习数据科学中的Python
大多数有抱负的数据科学家是通过学习为开发人员开设的编程课程开始认识 python 的,他们也开始解决类似 leetcode 网站上的 python 编程难题。他们认为在开始使用 python 分析数据之前,必须熟悉编程概念。
一墨编程学习
2019/08/07
1.3K0
干货:如何正确地学习数据科学中的Python
逆序打印字符串
s = input("请输入一个字符串:") if len(s) > 31: print("您输入的字符串过长,请重新输入:") else: l = len(s) print("字符串的长度:%d" % l) print(s[::-1])
汪凡
2018/05/29
7490
如何查找正在等待打印的打印机的打印任务
加菲猫的VFP
2023/08/21
2220
如何查找正在等待打印的打印机的打印任务
Python如何将byte(b”)字符串正常打印
这种事情在python2上很少遇到,但是python3就会遇到,很多时候是因为python修改编码,增强了兼容性的缘故。
用户2353021
2020/05/12
3.5K0
html如何打印_html打印代码
通常在浏览网页的时候,网页上总是出现一些和内容无关的内容,在打印的时候,要是把整个网页都打印下来,总会有些不方便。。。所以在有需要打印的网页上稍微设置一下打印页是很有必要的。。。
全栈程序员站长
2022/09/22
12.6K0
突破僵固型思维:如何“正确地”犯错?
成长型思维认为人的能力是不断成长的,因此会把注意的重点放到通过努力来获得能力成长上。
早起的鸟儿有虫吃
2018/12/21
7300
如何正确地迁移到云原生应用架构
原生云的崛起 软件正在吞噬这个世界——马克.安德森(Mark Andreessen) 近年来,一直被拥有根深蒂固的传统思想的大佬们统治的企业正在被快速打乱,他们正在被以软件为核心的企业所破坏。例如S
Rainbond开源
2018/05/31
1.5K0
Python中os.path.dirname(__file__)的用法
os.path.dirname()的用途 os.path.dirname()用来获取文件的路径。 如: 1 2>>> os.path.dirname('/home/woodenrobot/Documents/LearnPython/test.py') /home/woodenrobot/Documents/LearnPython os.path.dirname(file)的用途 而os.path.dirname(__file__)是用来获取python文件运行时的路径。 比如有一个test.py脚本内容为
木制robot
2018/04/11
1.4K0
如何在GitHub正确地使用 Curl 下载文件?
这在大多数情况下都有效,但是,您会注意到,有时当您从 GitHub 或 SourceForge 下载文件时,它不会获取正确的文件。
网络技术联盟站
2022/04/30
2.5K0
如何在GitHub正确地使用 Curl 下载文件?

相似问题

打印不带文件扩展名的__file__

42

如何在C中不使用__FILE__打印文件名

24

如何正确地打印ASCII艺术?

34

如何从os.path.dirname(__file__)返回的路径中删除__file__?

44

了解__FILE__

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文