【发布时间】:2020-09-15 03:36:33
【问题描述】:
我试图在范围和链接的上下文中确定变量声明的所有细微差别。
考虑以下两个sn-ps代码:
代码 1 阻止 extern 声明
#include <stdio.h>
static int i=4;
int main()
{
{
i++;
printf("i is %d \n",i);
i++;
}
printf("i is %d \n", i);
i++;
printf("i is %d \n", i);
return 0;
}
输出是:
i is 5
i is 6
i is 7
代码 2 阻止 extern 声明
#include <stdio.h>
static int i=4;
int main()
{
{
extern int i;
i++;
printf("i is %d \n",i);
i++;
}
printf("i is %d \n", i);
i++;
printf("i is %d \n", i);
return 0;
}
输出是:
i is 5
i is 6
i is 7
鉴于这两个代码 sn-ps 生成相同的输出,我将假设它们在“幕后”以相同的方式运行(即编译器生成相同的结果可执行文件)。
那么问题来了:
代码 2 是否只是执行代码 1 的一种“礼貌”、用户友好的方式(即,您要通知读者,“嘿……这个变量 i 已在其他地方定义这个文件”?)。那么extern以这种方式使用是否只是满足某种约定?
【问题讨论】:
-
代码 2 对
i进行了不必要的(重新)声明。许多程序员会认为它没有帮助。通常,您不应在函数内声明extern变量。有一个 GCC 警告-Wnested-externs选项来警告嵌套的extern声明 - 即函数内部的extern声明。 -
@JonathanLeffler 啊哈。很高兴知道。我问的唯一原因是因为在我的《C Programming: A Modern Approach》一书中,作者在谈论变量声明时多次使用代码 2-esque 示例(例如第 463 和 465 页)
-
金先生的书?这是一本很不错的书。理论上,您应该知道函数内部的
extern是什么意思,但这仍然是值得商榷的做法。我认为所有这样的声明——函数或变量——都是不可取的,即使语言允许它们。 GCC 有支持我的偏见的选项,尽管默认情况下它们没有启用。