【发布时间】:2012-04-27 12:44:20
【问题描述】:
我的问题是关于statement expressions,它是作为 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
这种做法(使用扩展)相当普遍,尤其是在 Linux 内核中的 container_of:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
与这种情况类似,我想定义一个宏来声明一个局部变量并对其进行处理。但是,我希望这样做不会污染当前范围内可用的变量名,并避免可能的重新定义。我无法在文档中找到关于在重新定义的情况下范围界定如何发生的确切信息。
在上述情况下,编译器不会发出有关重新定义的警告。我的问题是我是否可以依靠语句表达式内部的变量不会影响外部范围内的同名变量这一事实?
【问题讨论】:
-
不允许声明名称以两个下划线开头的变量。
-
你的用法不只是复合语句吗?根据链接的文档,它必须是一个语句表达式,它必须用括号括起来
-
@msam: 是的,但我想用括号定义一个宏