编码、搜索路径、#pragma指令

编码

大家都遇到过乱码,本质在于默认和使用的字符集不同,用不同的编码在交流。尽管Unicode是世界标准,但它在某些场合未必是最优的编码,不一定会采用。

编码举例

比如python.py:
s = '你好'
$ hexdump -c python.py
0000000 s = ' 344 275 240 345 245 275 ' \r \n

每个中文是3个字节,是UTF-8编码。

源代码的编码

  • VS2019: C语言代码开头默认插入EF BB BF标志(BOM标志), 代表UTF-8编码。如果修改为Unicode Little Endian编码保存,代码开头会被插入FF FE.

  • Javac提供-encoding编译选项指定代码编码。

  • HTML提供charset属性指定编码格式。

乱码的本质

  • 以Python为例:从源代码角度,程序员写完之后保存编码格式A,放到Python解释器运行,它按编码格式B解析,最终输出的结果也可能在命令行窗口展示,它使用编码C. 只有A/B/C都适配,结果才是预期。

BOM标记

  • 为了更清晰标明字符编码,引入了BOM ( Byte-Order Mark). BOM的设计高明之处在于它将字符编码信息放在文件开头,而非文件之外,强制要求对字符编码的判断。注意,BOM只对UTF-16和UTF-8有效,对其他编码是无效的。

搜索路径

不同路径存在相同的头文件,头文件搜索也有自己的规则。库文件同样有类似搜索路径问题。

GCC头文件

GCC编译C代码,根据是""或<>方式不同,头文件路径搜索顺序有差异。

  • ""
    • 被编译的源代码文件所在当前目录
    • -iquote指定的路径(只用于引号括起来头文件,如多个路径,从左到右依次搜索)
    • -I指定的路径(如多个路径,从左到右依次搜索)
    • -isystem指定的路径(如多个路径,从左到右依次搜索)
    • 标准系统头文件路径
    • -idirafter指定的路径(如多个路径,从左到右依次搜索)

  • <>
    • -I指定的路径(如多个路径,从左到右依次搜索)
    • -isystem指定的路径(如多个路径,从左到右依次搜索)
    • 标准系统头文件路径
    • -idirafter指定的路径(如多个路径,从左到右依次搜索)

有兴趣的可以写多个不同路径的相同名称头文件,用""或<>测试上面的顺序,可以一一验证。比较有趣的是,即使是系统头文件<stdio.h>, 也可以改成"stdio.h", 这样就遵循上面""的搜索顺序,可以达到覆盖系统头文件的效果。

GCC库文件

库文件不像头文件那样有这么多分类:

  • -L参数

  • LIBRARY_PATH或LD_LIBRARY_PATH

  • /etc/ld.so.conf路径

  • 系统默认的库路径(如/lib, /usr/lib等)。

#pragma指令

pragma是编译器特殊指令,随编译器不同,可实现个性化处理。它和命令行编译选项不同之处在于,它支持更精细控制某个函数或者某个类。


若文章对您有帮助,欢迎关注。助您在编程路上越走越好!

微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、iOS、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值