如何在编译时确定这件事?

jiandingzhe 2013-08-04 08:56:57
我想在编译时确定int64_t的确是64位,否则就死出去。如何做到这点?好像可以用模板?
...全文
614 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
only_lonely 2013-08-07
  • 打赏
  • 举报
回复
楼上明显是被新人夸了,内心窃喜中。 话说,我也很膜拜楼上,是个专业人士。
孤影品茗 2013-08-07
  • 打赏
  • 举报
回复
用预编译指令,Over!!!!
sgyiliya 2013-08-07
  • 打赏
  • 举报
回复
引用 47 楼 only_lonely 的回复:
楼上明显是被新人夸了,内心窃喜中。 话说,我也很膜拜楼上,是个专业人士。
来看小诗膜拜的人。
jiandingzhe 2013-08-06
  • 打赏
  • 举报
回复
引用 27 楼 supermegaboy 的回复:
如果还希望编译器输出出错的文件和行号,上面的宏也可以做到,作些许修改就行,这个留给楼主做趣味练习吧,呵呵。
啊,果然咱作为野生程序员,这种技能就会不足么……
jiandingzhe 2013-08-06
  • 打赏
  • 举报
回复
引用 22 楼 ri_aje 的回复:
static_assert 就是干这事儿的。编译器不支持的话,可以用类似的模板技术,根据 int64_t 的大小生成编译错误。
看看boost有没有这玩意
jiandingzhe 2013-08-06
  • 打赏
  • 举报
回复
引用 3 楼 qq120848369 的回复:
#include <stdint.h> 里有可移植的定义,不需要你care。
我知道,但是它万一不可靠呢? stdint.h里面的类型是用一系列typedef产生的,不同的环境下带的stdint.h,内容会不一样。万一有小白把A环境的stdint.h直接拷给B怎么办?
飞天御剑流 2013-08-06
  • 打赏
  • 举报
回复
引用 45 楼 jiandingzhe 的回复:
[quote=引用 27 楼 supermegaboy 的回复:] 如果还希望编译器输出出错的文件和行号,上面的宏也可以做到,作些许修改就行,这个留给楼主做趣味练习吧,呵呵。
啊,果然咱作为野生程序员,这种技能就会不足么……[/quote] 从自学这个角度来看的话,全都属于“野生”程序员。
飞天御剑流 2013-08-05
  • 打赏
  • 举报
回复
如果还希望编译器输出出错的文件和行号,上面的宏也可以做到,作些许修改就行,这个留给楼主做趣味练习吧,呵呵。
飞天御剑流 2013-08-05
  • 打赏
  • 举报
回复
欲确定楼主的需求,仅仅用sizeof是不够的,因为一个字节的二进制宽度不一定是8位,还需要乘上字节的位数,这个用宏CHAR_BIT就行了。 然后再加个静态断言,static_assert在boost和C++11中都有,没有这个条件的可以自定义一个,方法很多,五花八门,有利用重载的,有利用SFINAE规则的,有用结构的,有用模板的,当然也有综合以上几种设施的,不过用以下方法可以做一个简易的,可以满足楼主的需求了: #define STATIC_ASSERT( e ) typedef int sa[ ( e ) ] 然后这样使用: STATIC_ASSERT( sizeof( _int64 ) * CHAR_BIT == 64 );
水平不流 2013-08-05
  • 打赏
  • 举报
回复
引用 23 楼 zjq9931 的回复:
[quote=引用 5 楼 ak47_wz 的回复:] [quote=引用 4 楼 zhctj159 的回复:] 什么叫死出去,,这词用得、、 if(sizeof(int64_t)!=64)exit(0);
他说的是 编译时, 你这个算是运行时. 不一样的. [/quote] sizeof是宏,是在编译时确定的。不是不是运行时[/quote] sizeof是宏?你确定? 是关键字.
  • 打赏
  • 举报
回复
引用 23 楼 zjq9931 的回复:
[quote=引用 5 楼 ak47_wz 的回复:] [quote=引用 4 楼 zhctj159 的回复:] 什么叫死出去,,这词用得、、 if(sizeof(int64_t)!=64)exit(0);
他说的是 编译时, 你这个算是运行时. 不一样的. [/quote] sizeof是宏,是在编译时确定的。不是不是运行时[/quote] sizeof 不是宏
  • 打赏
  • 举报
回复
引用 5 楼 ak47_wz 的回复:
[quote=引用 4 楼 zhctj159 的回复:] 什么叫死出去,,这词用得、、 if(sizeof(int64_t)!=64)exit(0);
他说的是 编译时, 你这个算是运行时. 不一样的. [/quote] sizeof是宏,是在编译时确定的。不是不是运行时
ri_aje 2013-08-05
  • 打赏
  • 举报
回复
static_assert 就是干这事儿的。编译器不支持的话,可以用类似的模板技术,根据 int64_t 的大小生成编译错误。
ForestDB 2013-08-05
  • 打赏
  • 举报
回复
应该是 # if ... # error ...
ForestDB 2013-08-05
  • 打赏
  • 举报
回复
# if sizeof(int64_t) != 8 error "int64_t is not 64 bits" 可以试试。
zybjtu 2013-08-05
  • 打赏
  • 举报
回复
引用 楼主 jiandingzhe 的回复:
我想在编译时确定int64_t的确是64位,否则就死出去。如何做到这点?好像可以用模板?
static_assert(8 == sizeof(int64_t)) ?
飞天御剑流 2013-08-05
  • 打赏
  • 举报
回复
引用 36 楼 stereoMatching 的回复:
[quote=引用 35 楼 supermegaboy 的回复:] [quote=引用 30 楼 stereoMatching 的回复:]
引用
因为一个字节的二进制宽度不一定是8位,还需要乘上字节的位数
学习了,能不能请你举个例子?什么情况下二进制宽度不一定是8位?
这种东西多见于大型机,例如IBM 7系列啊、S / 360、370、390啊等等,字节宽度9位、12位、16位等等都有过,因为CPU如何设计并无标准,各家提供商根据机器的设计目标比较随意。 C标准的RATIONAL也谈到了这个问题,因此才有宏CHAR_BIT。[/quote] 谢谢了,从你的回应中让人感觉得出你是个经验很丰富的人 好像有不断在接触,学习新的技术?毕业了吗?一般只有学生才会有这种热诚 毕业后有许多人除非是工作需要,否则都不会主动学习了[/quote] 噢,谈不上什么经验丰富,不过是查查资料,举手之劳罢了。不过毕业后倒真是搞过些许年的系统管理,真正接触过的是IBM的AIX,还有它的一些机架式、刀片式服务器,以及一些HP、DELL的塔式服务器。后来才重新回到软件上来。书偶倒是经常看,不是因为有热诚或者主动学习,皆因现在这个社会竞争太激烈,不拿些东西充实下自己就老是觉得很彷徨........
line_us 2013-08-05
  • 打赏
  • 举报
回复
技术性观摩讨论。
ziyue007 2013-08-05
  • 打赏
  • 举报
回复
引用 17 楼 nbabn 的回复:
#if !defined(_WIN64)
  #error ...
#endif
这样就编译不过去了。
假设是32位的话不是就不走这一步了,相当于白写不是,编译的时候这就是非活动处理模块吧
nbabn 2013-08-05
  • 打赏
  • 举报
回复
#if !defined(_WIN64)
  #error ...
#endif
这样就编译不过去了。
加载更多回复(29)

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧