gpt4 book ai didi

c - 语句表达式中的 'redefining' 变量安全吗?

转载 作者:行者123 更新时间:2023-11-30 14:25:27 25 4
gpt4 key购买 nike

我的问题是关于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) );})

与本例类似,我想定义一个宏,它声明一个局部变量并用它做一些事情。但是,我希望这样做不会污染当前范围内可用的变量名称,并避免可能的重新定义。我无法在文档中找到有关重新定义时范围界定如何发生的信息。

在上述情况下,编译器不会发出有关重新定义的警告。我的问题是我是否可以相信语句表达式内的变量不会影响外部作用域中的同名变量?

最佳答案

当然这是安全的,这就是示波器的用途。

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

关于c - 语句表达式中的 'redefining' 变量安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10350836/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com