是否有C标准的着名"概况"?

Hen*_*olm 12 c language-lawyer

我编写C代码,对实现做出某些假设,例如:

  • char 是8位.
  • 有符号整数类型是两个补码.
  • >> 有符号整数sign-extends.
  • 整数除法将负商指向零.
  • doubleIEEE-754是双倍的,可以通过uint64_t预期的结果进行打字和打字.
  • 涉及NaN的比较总是评估为假.
  • 空指针都是零位.
  • 所有数据指针都具有相同的表示形式,并且可以在size_t不丢失信息的情况下转换回来.
  • 指针算术on char*与普通算术相同size_t.
  • 函数指针可以在void*不丢失信息的情况下再次强制转换.

现在,所有这些都是C标准所不能保证的,所以严格来说我的代码是不可移植的.但是,它们在我目前正在瞄准的体系结构和ABI上都是正确的,经过仔细考虑之后,我已经确定他们未能在某些架构上保留的风险,我将来需要将其作为目标.与我现在做出假设所得到的实用好处相比.

问题是:我如何最好地记录这一决定?我的许多假设都是由几乎每个人(非八位字节char或符号幅度整数?未来,商业上成功的架构?)制定的.其他人更有争议 - 最危险的可能是关于函数指针的问题.但是,如果我只列出一切我认为超出标准给我,读者的眼睛只是要呆滞,他可能没有注意到,实际上很重要的人.

那么,是否有一些众所周知的关于成为"有点正统"的架构的假设,我可以通过引用合并,然后只明确记录我甚至超出的范围?(实际上这样的"概况"将定义一种新的语言,它是C的超集,但它可能不会承认这么多的话 - 而且它也可能不是一种实用的方法来考虑它).

澄清:我正在寻找一种记录我的选择的简写方式,而不是一种自动测试给定编译器是否符合我的期望的方法.后者显然也很有用,但并不能解决所有问题.例如,如果业务合作伙伴联系我们说:"我们正在制作基于Google新G2015芯片的设备;您的软件会在其上运行吗?" - 那么能够回答"我们还没有使用过那个拱门,但如果它有一个满足这样的C编译器就不应该是一个问题".

澄清甚至更多,因为有人投票决定关闭"不具有建设性":我不是在这里寻求讨论,只是为了指向实际的,现有的,正式的文件,可以通过引用并入我的文档.

And*_*nck 6

我将介绍一个STATIC_ASSERT宏并将所有假设放在这样的断言中.

  • 我不太热衷于完全依赖实验.例如,与NaN相比较的主要风险并不是实现将_always_错误(相对于我的期望),而是它会_sometimes_工作,有时不工作,例如使用编译器自由重写`a <b `到`!(a> = b)`,反之亦然,基于它认为会在上下文中生成更高效的代码.即使编译器实际上并不保证我依赖的行为,具体的实验也会偶然成功,这是完全合理的. (3认同)