Tag: 标准 合规性

我是否有sizeof(type)== sizeof(无符号类型)的保证?

sizeof char,int,long double ……可能因编译器而异。 但是,根据C ++ 11或C11标准,我是否有任何有符号和无符号基本积分类型的大小相同的保证?

超出翻译限制是不确定的行为,是否有检查工具来找到它?

原始问题: 我正在搜索C90标准,以便在编写高可移植代码时注意事项,同时对编译器供应商的良好意愿缺乏信任,并假设我的软件有时可能会杀死某人,如果我做错了。 让我们说我有点偏执。 目前我在考虑“翻译限制”(5.2.4.1 ANSI / ISO 9899:1990)。 正如标准中所指出的那样:“ ansi C是否限制了程序中外部变量的数量? ”,这些是标准符合实现的最低要求。 现在另一方面,这意味着,任何实现都不需要做更多 – 如果我想确保我的代码适用于任何confrom实现,这些限制代表我的绝对限制。 到目前为止很烦人。 因此编译器供应商选择的限制等于或高于最低要求的转换限制。 如果超出特定实施的实施定义的转换限制,现在会发生什么? 在我的ANSI / IO 9899:1990(C90)副本中,我没有找到任何东西,所以我认为它是“3种类型的未定义行为”(通过省略)。 另一方面,这不是第一次,我误解了标准或没有找到合适的通道。 所以这是我的问题: IS是否超过C90中特定实现未定义行为的转换限制? C90行为是否适用于C95 / C96以及新迭代C99和C11的修正版本? 有没有人看过那里的检查工具,检查最小的或(工具)用户定义的限制? 超出原始问题的方面: 答案和评论中有趣的方面: 1)正如迈克尔·伯尔在对该问题的直接评论中指出的那样,根据C标准(我只检查了没有更正的C90,以及C99草案,Michael 在这里引用),符合C的实现只需要接受一个程序,它同时包含所有限制,在最严格的解释中取消任何最小限制保证。 2)正如rubenvb和Keith Thompson指出的那样,某些质量的实现应该为案例提供诊断,超出它们的实现定义限制,特别是如果不符合最低要求(rubenvb在评论中链接了MSVC的示例) 。 3)由于超出编译器限制可能是未定义的行为,但肯定会导致某些错误,转换限制适用于我的某段代码的“变量”的值代表重用的前提条件。 我个人的策略来处理它们 1)因此,对于最大的偏执狂,我会愚弄自己,并惹恼编译器供应商的支持,请求保证我,实现选择的限制适用于任何程序。 🙁 2)因此,我将研究编译器文档以及编译器支持获得确认的痛苦程度: – 对于每个转换限制,如果超出,将引发诊断,并且 – 因为它是未定义的行为,如果每个超出翻译限制的实例都会引发诊断 – 或者另一个错误已经阻止了编译。 3)因此,我将尝试开发一个工具(或者如果我真的必须开发自己),测量这些值,并将它们作为我的程序的代码重用的前提条件。 正如Keith Thompson在本回答中指出的那样,一些价值观可能需要更深入地了解实施如何实施。 我不能完全确定在这种情况下除了2)中的行为之外还能提供什么帮助。但是,据我所知,我必须进行测试 – 但我只需要测试是否有UB(没有诊断),如果这是在这种情况下,成功的测试不能保证一般情况下的正确性。 回答说: 是的,它是未定义的行为。 […]