0

我的问题是关于语句表达式,它是作为 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) );})

与这种情况类似,我想定义一个宏来声明一个局部变量并对其进行处理。但是,我希望这样做不会污染当前范围内可用的变量名,并避免可能的重新定义。我无法在文档中找到关于在重新定义的情况下范围界定如何发生的信息。

在上述情况下,编译器不会发出有关重新定义的警告。我的问题是我是否可以依靠语句表达式内部的变量不会影响外部范围内的同名变量这一事实?

4

2 回答 2

2

当然这是安全的,这就是范围的用途。

(正如 dreamlax 在他的评论中指出的那样,带有两个下划线的标识符是为实现(编译器、库、托管环境......)保留的,所以你不应该使用它们。)

于 2012-04-27T12:53:07.927 回答
0

关于范围

从 3.1.2.1 ANSI C(类似 C99 中的 6.2.1):

如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表内,则标识符具有块作用域,其终止于关闭关联块的 }

...

如果一个词法相同标识符的外部声明存在于相同的名称空间中,它会被隐藏,直到当前作用域终止,之后它再次变为可见。

因此,假设编译器是兼容的,您应该能够假设表达式内的变量不会影响外部范围内的变量

于 2012-04-27T13:12:33.947 回答