技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 198|回复: 3
收起左侧

【C语言】给微软MSVC使用的inttypes.h和stdatomic.h

[复制链接]

1030

主题

2287

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17558 个
贡献
35282 次
宅之契约
0 份
在线时间
1681 小时
注册时间
2014-1-26
发表于 2019-2-3 11:50:49 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
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
此处我直接搬运一下:
it.png
msinttypes-r26.zip (6.74 KB, 下载次数: 0)

15

主题

154

帖子

1018

积分

用户组: 上·技术宅

UID
3808
精华
2
威望
18 点
宅币
768 个
贡献
50 次
宅之契约
0 份
在线时间
163 小时
注册时间
2018-5-6
发表于 2019-2-3 12:07:40 | 显示全部楼层
顶站长,小弟我记得pells C对C11标准支持的比较好,至于msvc它不管C99或者C11,我认为他自己就有一套msvc的C语言标准。
顺便提一下,补头文件对我来说是个恐怖的事情,因为大多数头文件包含别的头文件,而别的头文件又包含别的头文件,这个我经常处理不好。
菜鸟一枚,直接指正,不必留情

25

主题

97

帖子

1338

积分

用户组: 版主

UID
1821
精华
6
威望
57 点
宅币
1060 个
贡献
37 次
宅之契约
0 份
在线时间
225 小时
注册时间
2016-7-12
发表于 2019-2-9 00:53:50 | 显示全部楼层
本帖最后由 Ayala 于 2019-2-9 01:02 编辑

新版本的vs不自己包含么
stdatomic.h和atomic区别很大么
还有
cinttypes和inttypes.h

1030

主题

2287

帖子

5万

积分

用户组: 管理员

一只技术宅

UID
1
精华
201
威望
271 点
宅币
17558 个
贡献
35282 次
宅之契约
0 份
在线时间
1681 小时
注册时间
2014-1-26
 楼主| 发表于 2019-2-9 23:09:45 | 显示全部楼层
Ayala 发表于 2019-2-9 00:53
新版本的vs不自己包含么
stdatomic.h和atomic区别很大么
还有

cinttypes是C++的,inttypes.h是C的。cinttypes是C++从C那里搬运过来的。

stdatomic.h是C的,atomic是C++的,但atomic不是C++从C的stdatomic.h搬运过来的。搬运的版本是cstdatomic。

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号|网站地图

GMT+8, 2019-4-25 04:24 , Processed in 0.107239 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表