Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是宏吗;“提供”;在<;浮动.h>;(在C89中)是否应表现为常量值?_C_Macros_C99_C11_C89 - Fatal编程技术网

是宏吗;“提供”;在<;浮动.h>;(在C89中)是否应表现为常量值?

是宏吗;“提供”;在<;浮动.h>;(在C89中)是否应表现为常量值?,c,macros,c99,c11,c89,C,Macros,C99,C11,C89,我正在写一个小项目,它必须考虑标准C的所有版本,从C89到C11,试图确保不同版本之间的某种程度的兼容性。在这样做的过程中,我发现C89中的标准头与C99中的规格非常不同 在C89中,中的几乎所有宏,除了FLT_RADIX之外,都不一定是常量表达式。但是,在C99中,中除FLT_ROUNDS之外的所有宏都是常量表达式(例如,它们可以在静态初始化器中使用) 我的猜测是,即使在古老的C89中,给定一致性实现的预期行为是中的所有宏(除了FLT_ROUNDS)在程序执行过程中都必须是不可修改的值,即使它

我正在写一个小项目,它必须考虑标准C的所有版本,从C89到C11,试图确保不同版本之间的某种程度的兼容性。在这样做的过程中,我发现C89中的标准头
与C99中的规格非常不同

在C89中,
中的几乎所有宏,除了
FLT_RADIX
之外,都不一定是常量表达式。但是,在C99中,
中除
FLT_ROUNDS
之外的所有宏都是常量表达式(例如,它们可以在
静态
初始化器中使用)

我的猜测是,即使在古老的C89中,给定一致性实现的预期行为是
中的所有宏(除了
FLT_ROUNDS
)在程序执行过程中都必须是不可修改的值,即使它们在语法上不能被视为常量表达式

另一方面,C89标准文件规定:

浮点模型表示法为除FLT_轮以外的所有值提供

这里的“所有值”是指在
中声明的宏列表

我的问题:在C89中提供的一词是什么意思?实现为宏提供了在程序执行过程中不可修改的值,这种解释正确吗?此外:对于目标执行环境,它们是不可修改的值吗


提前谢谢

在这种情况下,您可以编写代码,就好像这些始终是常量表达式一样,如果有一天您发现一个编译器的代码没有编译,那么请担心它。这里似乎没有任何UB或运行时错误的风险,只有编译时错误。编译时问题总是会出现在新的可移植项目中——你只需要找到它们并为你构建的平台修复它们。我不认为这是问你自己的正确问题。C89几乎是30年前的事了,C委员会从那时起就对它进行了修改,在许多方面都是出于这个原因:更准确地预测会发生什么。至于今天编写代码,如果您有一个甚至不遵守C99的编译器列表,那么您应该对它们进行单独的预测,以防它们超出预期。对于您提到的情况,我无法想象任何编译器提供程序,即使是30年前,会愚蠢到将这些表达式作为函数调用或类似调用。@JensGustedt:谢谢您的评论。Plaucer的《标准C库》一书对此主题进行了有趣的讨论,并建议通过将其某些宏定义为某些联合成员的值来实现,这些成员以前是使用类型双关和位模式构建的。然而,看起来无论如何,这些值在程序执行过程中都是不可修改的。@JensGustedt:许多C89编译器提供C99中更有用的部分作为扩展,即使它们不支持可变长度数组之类的东西。至于编译器是否有一些值作为表达式,我认为某些实现者可能认为提供运行时选项来控制浮点行为是有用的(例如,16位实现可能有一个选项,使“double”忽略尾数的底部5位,从而形成一个“double”。乘法运算需要9次16x16乘法运算,而不是16次)。DBL_DIG应该对其中一个做什么?