C 宏中的参数名称是否会产生先前定义的副作用?
Can the parameter names in a C macro have side effects from previous definitions?
我知道在 C 宏中使用参数时的 argument prescan,但当您使用已定义的宏时会发生这种情况。但是,当你定义它时,你需要特别注意选择参数名称吗?预处理器是否以“原子”方式解析宏,以便不扩展参数名称?
我的意思是,想象一下这个场景:
#define MYVAL {is this safe?}
#define ADDVALUES(MYVAL,YOURVAL) do{(MYVAL)+(YOURVAL);}while(0)
int val=ADDVALUES(1,3);
如何解析 ADDVALUES 宏 ? MYVAL 是否在定义 ADDVALUES 宏之前展开?
我没有读过任何关于在宏中选择参数名称的警告,所以我倾向于相信它们的名称在宏被解析之前没有展开(我读过关于在宏中命名局部变量的警告,关于宏自己命名,关于吞下分号等,但与选择参数名称无关)。
我试过 gcc 4.8.5
#define NV1 a
#define V1(NV1) b NV1
V1(foo)
gcc -E test.h
结果
b foo
所以参数名称没有扩展为宏并覆盖了之前的冲突定义
参数 MYVAL
的范围不同于 object-like 宏 MAYVAL
的范围。引用标准的相关部分,6.10.3,p10:
The parameters are specified by the optional list of identifiers,
whose scope extends from their declaration in the identifier list
until the new-line character that terminates the #define preprocessing
directive.
给出示例中的最后一行将展开为
int val=do{(1)+(3);}while(0);
我知道在 C 宏中使用参数时的 argument prescan,但当您使用已定义的宏时会发生这种情况。但是,当你定义它时,你需要特别注意选择参数名称吗?预处理器是否以“原子”方式解析宏,以便不扩展参数名称?
我的意思是,想象一下这个场景:
#define MYVAL {is this safe?}
#define ADDVALUES(MYVAL,YOURVAL) do{(MYVAL)+(YOURVAL);}while(0)
int val=ADDVALUES(1,3);
如何解析 ADDVALUES 宏 ? MYVAL 是否在定义 ADDVALUES 宏之前展开?
我没有读过任何关于在宏中选择参数名称的警告,所以我倾向于相信它们的名称在宏被解析之前没有展开(我读过关于在宏中命名局部变量的警告,关于宏自己命名,关于吞下分号等,但与选择参数名称无关)。
我试过 gcc 4.8.5
#define NV1 a
#define V1(NV1) b NV1
V1(foo)
gcc -E test.h
结果
b foo
所以参数名称没有扩展为宏并覆盖了之前的冲突定义
参数 MYVAL
的范围不同于 object-like 宏 MAYVAL
的范围。引用标准的相关部分,6.10.3,p10:
The parameters are specified by the optional list of identifiers, whose scope extends from their declaration in the identifier list until the new-line character that terminates the #define preprocessing directive.
给出示例中的最后一行将展开为
int val=do{(1)+(3);}while(0);