- UID
- 1
- 精华
- 201
- 积分
- 55569
- 威望
- 271 点
- 宅币
- 17264 个
- 贡献
- 34496 次
- 宅之契约
- 0 份
- 最后登录
- 2019-2-18
- 在线时间
- 1635 小时
- QQ

用户组: 管理员
一只技术宅
- UID
- 1
- 精华
- 201
- 威望
- 271 点
- 宅币
- 17264 个
- 贡献
- 34496 次
- 宅之契约
- 0 份
- 在线时间
- 1635 小时
- 注册时间
- 2014-1-26
|
MSVC一直以来对C语言标准支持不全,但有时候又具备一些奇怪的(对于当年而言的)超前特性(比如匿名联合体和结构体等)使其依然具有一定的实用性。即便如此,你要想让代码写得舒服,你还是得按照标准来写。
那么对于最基础的整数类型,我们是使用MSVC里面能用的stdint.h好呢,还是用C99标准新添加的inttypes.h好呢?虽说后者增加的东西或许并不都是你需要的,比如对printf格式代码的跨平台支持,以及完整除法运算所需的imaxdiv_t类型和imaxdiv函数等。
此外,当你尝到了GCC的全程序优化的甜头后,你再跑回去看MSVC,你会怎么想呢?
- C标准支持不全。局部变量甚至必须被定义在语句的前面。
- 没有足够强大的全程序优化,虽说有/LTCG,但它看起来就和没有一样。
- 对SIMD指令集的优化贼弱,强行给你擅自加入一堆movaps等,来解决由于它自身优化很差而带来的寄存器不够的问题。
以及
- 完善的代码高亮和自动提示、自动补全功能。
(虽说对于C语言调用COM类的状况下而言,它的自动提示功能并不知道你写的是C还是C++,会在你试图通过虚表调用COM类的时候告诉你“没有lpVtbl成员”) - 令人上瘾的F12转到定义功能。这个功能不仅仅对于编程开发,对于编程的学习而言更具有关键性的使用价值。
- 虽说不完整,但基本够用的一整套支持多线程和多机器的调试器工具。
- 漂亮的界面
- 一帮惹不起的信徒(咳咳)
由于Cygwin过于Tony带水,拖家带口,有悖于我们希望编译器足够好用的初衷,我选择MinGW。
然而我发现我在使用MinGW的时候我的代码里既可以使用Windows.h(需要设置-mwindows编译器命令行参数)又可以使用inttypes.h和stdatomic.h。我甚至还可以使用pthread.h,虽说其实根本不好用——它依赖unistd.h,但这样一来,我搞不好就要把Unix全家桶搬到Windows里面了,这十分南辕北辙。不如直接用Windows的API。
对于如此纠结的情况,我是使用stdint.h好呢,还是使用inttypes.h好呢,我该不该使用stdatomic.h呢?
我决定采用打补丁的方式,对于缺乏这些头文件的情况下,使用替补的去代替。我在我的工程目录里添加两个目录,一个是“备用头文件”,用于存放这些备用的头文件。另一个则是“额外包含头文件”,这个是给编译器查找头文件目录指定的,让编译器从这里面查找额外的头文件。任何人如果想要编译我这个工程,他应该先用自己的工具编译一下。如果编译不通过,他会在我的文档里看到说明,然后把缺失的头文件从“备用头文件”目录里拷贝到“额外包含头文件”目录里,然后再次编译即可。
那么问题来了。这两个头文件我是应该自己写呢,还是从现有的找呢?
人生宝贵,造重复轮子(还不一定比别人的圆)不可取。我决定使用别人写好的头文件。
其中,谷歌的开源库里有inttypes.h是给MSVC用的。
https://code.google.com/archive/p/msinttypes/downloads
此处我直接搬运一下:
msinttypes-r26.zip
(6.74 KB, 下载次数: 0)
|
|