我的问题是关于语句表达式,它是作为 GNU C 中的扩展添加的。考虑以下代码:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int i = 0;
printf("%d\n", i);
{int i = 1;printf("%d\n", i);}
printf("%d\n", i);
return EXIT_SUCCESS;
}
编译 ( gcc -Wall -std=gnu99 lala.c -o lala
) 并运行将产生:
0
1
0
这种做法(使用扩展)相当普遍,尤其是container_of
在 Linux 内核中:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
与这种情况类似,我想定义一个宏来声明一个局部变量并对其进行处理。但是,我希望这样做不会污染当前范围内可用的变量名,并避免可能的重新定义。我无法在文档中找到关于在重新定义的情况下范围界定如何发生的信息。
在上述情况下,编译器不会发出有关重新定义的警告。我的问题是我是否可以依靠语句表达式内部的变量不会影响外部范围内的同名变量这一事实?