为什么GCC头文件中的常量表达式用括号括起来?
#define INTMAX_MIN (-9223372036854775807LL)
#define INTMAX_MAX (9223372036854775807LL)
如果我这样省略括号,会有什么区别?
#define INTMAX_MIN -9223372036854775807LL
#define INTMAX_MAX 9223372036854775807LL
为什么会有“L”后缀?如果我写以下内容,会是一样的吗?
#define INTMAX_MIN -9223372036854775807
#define INTMAX_MAX 9223372036854775807
有实际的用途还是总是一回事?
我知道'L'代表了很长时间,我也很清楚C宏中括号的重要性。我是出于好奇而问这个。
最佳答案
如果你写
a = 7 INTMAX_MIN;
您会期望得到语法错误,因为从表面上看这将是一个非法表达式。而且它将,因为它扩展到
a = 7 (-9223372036854775807LL);
确实确实给您语法错误。但是如果没有括号,它将扩展为:
a = 7 -9223372036854775807LL;
尽管显然不是您想要的,但这不会给您带来错误。
更一般而言,所有这些定义都为看起来像标识符的事物提供了扩展。在算术表达式中,标识符是“主表达式”,但-9223372036854775807LL不是。但是,带括号的表达式是“主表达式”。
这是真正的原因。这样宏就可以将看起来像主表达式的内容扩展为一个主表达式的内容。您将不会对发生的事情感到惊讶。在编程中,惊奇通常是不好的。
通常,这并不重要,但是编写定义的人员不希望它们正常工作。他们希望他们始终工作。
尾部LL将这个整数文字标记为
long long
类型,通常为(在这种情况下)64位。如果没有LL后缀,则字面量可以解释为int,long int或long long int,以最早支持64位值的方式为准。固定类型与固定值一样重要。关于c - gcc标准 header 中的括号太多,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27663815/