【发布时间】:2020-06-22 10:34:28
【问题描述】:
我想用另一个值重新定义一个宏常量的值。现在我知道了使用#undef 并随后重新使用#define 宏本身的技术,例如:
#define LEN_OSG 59
....
#undef LEN_OSG
#define LEN_OSG 70
我尝试将其缩写并发现可能通过另一个 #define 指令重新定义宏常量:
#define LEN_OSG 59
....
#define LEN_OSG 70
#include <stdio.h>
#define LEN_OSG 59
int main()
{
printf("LEN_OSG is %d.\n",LEN_OSG);
#define LEN_OSG 70
printf("LEN_OSG is %d.",LEN_OSG);
}
当然,gcc 和 clang 都会给我警告:
警告:“LEN_OSG”重新定义。 (gcc)
和
警告:“LEN_OSG”宏已重新定义 [-Wmacro-redefined] (clang)
但他们确实编译它(当然没有-Werror 选项)并给出正确的结果:
Execution build compiler returned: 0
Program returned: 0
LEN_OSG is 59.
LEN_OSG is 70.
我的问题:
- 我可以通过忽略此特定警告,使用另一个 #define 指令重新定义宏吗?
- 这是否涉及未定义的行为或对程序造成潜在损害?
非常感谢。
【问题讨论】:
-
你可以仔细看看
#undef -
@Gerhardh 我应该特别关注
#undef哪里?我不明白。 -
您收到警告,因为宏已定义。现在您有了一个预处理器指令,它使宏不再被定义。对我来说似乎是一个完美的匹配。
-
不要试图搞乱预处理器指令,而是写一个新问题来解释你试图实现的更大目标并询问如何实现它。
标签: c macros language-lawyer c-preprocessor preprocessor-directive