围绕常量或围绕涉及常量的强制转换表达式的括号
Parentheses around a constant or around a cast expression involving a constant
我时常看到这段代码:
#define X1 (13)
#define X2 ((size_t)13)
据我了解,(外部)()
在这里是多余的。对吗?
UPD:一些软件开发指南可能需要它。
例如:
MISRA C:2004,规则 19.4(必需):
C macros shall only expand to a braced initialiser, a constant, a parenthesised expression, a type qualifier, a storage class specifier, or a do-while-zero construct.
但是,MISRA C:2012 有:
#define MY_NULL_2 ( void * ) 0
#define sqrt( x ) ( _BUILTIN_sqrt ( x ) )
我不认为第一个例子需要括号,但总是用括号括起宏体是一个合理的习惯。
如果您从定义中删除外括号然后在上下文中调用它,第二个将产生意外的分组 X2[a]
。
As I understand, the (outer) () are redundant here. Is that correct?
在第一种情况下,(13)
可能会导致问题。见下文。
在第二种情况下,((size_t)13)
倾向于防止出现问题,因为它确保转换(没有顶部 order of precedence)仅应用于 13
而不是某些后续代码。
#define X1 (13)
中的()
有劣势。考虑 字符串化.
如(80)
,形成了错误的格式字符串
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define BUFFER_LEN_WITH (80)
#define BUFFER_LEN_WITHOUT 80
// Could have used either BUFFER_LEN_WITH, BUFFER_LEN_WITHOUT here.
#define BUFFER_SIZE (BUFFER_LEN_WITHOUT + 1)
int main(void) {
char buffer[BUFFER_SIZE];
printf("Format: <%s>\n", "%" TOSTRING( BUFFER_LEN_WITH) "s");
printf("Format: <%s>\n", "%" TOSTRING( BUFFER_LEN_WITHOUT) "s");
int count = scanf("%" TOSTRING( BUFFER_LEN_WITHOUT) "s", buffer);
if (count == 1) {
printf("<%s>\n", buffer);
}
}
输出
Format: <%(80)s> <-- Wrong format
Format: <%80s>
zvxcx
<zvxcx>
我时常看到这段代码:
#define X1 (13)
#define X2 ((size_t)13)
据我了解,(外部)()
在这里是多余的。对吗?
UPD:一些软件开发指南可能需要它。
例如: MISRA C:2004,规则 19.4(必需):
C macros shall only expand to a braced initialiser, a constant, a parenthesised expression, a type qualifier, a storage class specifier, or a do-while-zero construct.
但是,MISRA C:2012 有:
#define MY_NULL_2 ( void * ) 0
#define sqrt( x ) ( _BUILTIN_sqrt ( x ) )
我不认为第一个例子需要括号,但总是用括号括起宏体是一个合理的习惯。
如果您从定义中删除外括号然后在上下文中调用它,第二个将产生意外的分组 X2[a]
。
As I understand, the (outer) () are redundant here. Is that correct?
在第一种情况下,(13)
可能会导致问题。见下文。
在第二种情况下,((size_t)13)
倾向于防止出现问题,因为它确保转换(没有顶部 order of precedence)仅应用于 13
而不是某些后续代码。
#define X1 (13)
中的()
有劣势。考虑 字符串化.
如(80)
,形成了错误的格式字符串
#define STRINGIFY(x) #x
#define TOSTRING(x) STRINGIFY(x)
#define BUFFER_LEN_WITH (80)
#define BUFFER_LEN_WITHOUT 80
// Could have used either BUFFER_LEN_WITH, BUFFER_LEN_WITHOUT here.
#define BUFFER_SIZE (BUFFER_LEN_WITHOUT + 1)
int main(void) {
char buffer[BUFFER_SIZE];
printf("Format: <%s>\n", "%" TOSTRING( BUFFER_LEN_WITH) "s");
printf("Format: <%s>\n", "%" TOSTRING( BUFFER_LEN_WITHOUT) "s");
int count = scanf("%" TOSTRING( BUFFER_LEN_WITHOUT) "s", buffer);
if (count == 1) {
printf("<%s>\n", buffer);
}
}
输出
Format: <%(80)s> <-- Wrong format
Format: <%80s>
zvxcx
<zvxcx>