疑问:具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。

时间:2022-01-15 06:09:43
最近看C primer pluse书上有这么一句话:具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。
静态变量是用static来声明,一个文件作用域变量具有内部链接还是外部链接,看在外部定义中是否使用了存储类说明符static,使用了static是内部链接。

疑问:静态变量中的static已经决定了一个变量是内部链接,书上的“具有外部链接的静态变量”这不是矛盾吗?

7 个解决方案

#1


我就说,有些教程看上去通俗易懂,却只会把问题越说越糊涂。
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对CPP印象挺好(虽然我只是大致翻了翻),但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题?
它应该这样说:“具有文件作用域的标识符是外部链接的,它所指示的对象具有静态存储期。”
顺便说一句,同样是static,它的位置不同,意义也不同:
static int i;  //文件作用域,内部链接,静态存储期。
int j;  //文件作用域,外部链接,静态存储期。
int f (void)
{
    static int x;    //块作用域,无链接,静态存储期。
    int y;    //块作用域,无链接,自动存储期和临时生存期。
    extern int i;    //外部链接,与前面的'static int i'指示同一个对象。
    extern int j;    //外部链接,与指示前面的'int j'指示同一个对象。
}

#2


引用 1 楼 sholber 的回复:
我就说,有些教程看上去通俗易懂,却只会把问题越说越糊涂。
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对CPP印象挺好(虽然我只是大致翻了翻),但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题?
它应该这样说:“具有文件作用域的标识符是外部链接的,它所指示的对象具有静态存储期。”
顺便说一句,同样是static,它的位置不同,意义也不同:
static int i;  //文件作用域,内部链接,静态存储期。
int j;  //文件作用域,外部链接,静态存储期。
int f (void)
{
    static int x;    //块作用域,无链接,静态存储期。
    int y;    //块作用域,无链接,自动存储期和临时生存期。
    extern int i;    //外部链接,与前面的'static int i'指示同一个对象。
    extern int j;    //外部链接,与指示前面的'int j'指示同一个对象。
}

非常感谢你的解答,英文的原话是:“A static variable with external linkage has file scope, external linkage, and static storage duration.”对比翻译过来的中文,应该没出什么大差错,所以我疑问不解,也就是说不管中文还是英文,就这句话而言,不存在“外部链接的静态变量”?

#3


疑问:具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。1楼的例子代码很赞啊!

#4


所以说:
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”

#5


引用 4 楼 zhao4zhong1 的回复:
所以说:
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”

老师,关于“标识符的链接、作用域和存储期”这3个我已经弄明白啦,就是在纠结“具有外部链接的静态变量”这个东西,不知道他到底是什么样的东西,感谢2位指点,了解了!

#6


我最近也在看,static表示的并不是静态存储时期,表示的是在文件作用域情况下是内部链接的,不加static的文件作用域就是外部链接。。。。。。。还有加static的块作用域是空连接,,,,,,,所谓的静态存储时期指的是变量的存储位置不变。希望对你有帮助。

#7


static一定是静态存储时期的变量,但静态变量不一定都是用static表示的,所以具有外部链接的静态变量就是指具有文件作用域不加staitic限定的变量。

#1


我就说,有些教程看上去通俗易懂,却只会把问题越说越糊涂。
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对CPP印象挺好(虽然我只是大致翻了翻),但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题?
它应该这样说:“具有文件作用域的标识符是外部链接的,它所指示的对象具有静态存储期。”
顺便说一句,同样是static,它的位置不同,意义也不同:
static int i;  //文件作用域,内部链接,静态存储期。
int j;  //文件作用域,外部链接,静态存储期。
int f (void)
{
    static int x;    //块作用域,无链接,静态存储期。
    int y;    //块作用域,无链接,自动存储期和临时生存期。
    extern int i;    //外部链接,与前面的'static int i'指示同一个对象。
    extern int j;    //外部链接,与指示前面的'int j'指示同一个对象。
}

#2


引用 1 楼 sholber 的回复:
我就说,有些教程看上去通俗易懂,却只会把问题越说越糊涂。
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对CPP印象挺好(虽然我只是大致翻了翻),但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题?
它应该这样说:“具有文件作用域的标识符是外部链接的,它所指示的对象具有静态存储期。”
顺便说一句,同样是static,它的位置不同,意义也不同:
static int i;  //文件作用域,内部链接,静态存储期。
int j;  //文件作用域,外部链接,静态存储期。
int f (void)
{
    static int x;    //块作用域,无链接,静态存储期。
    int y;    //块作用域,无链接,自动存储期和临时生存期。
    extern int i;    //外部链接,与前面的'static int i'指示同一个对象。
    extern int j;    //外部链接,与指示前面的'int j'指示同一个对象。
}

非常感谢你的解答,英文的原话是:“A static variable with external linkage has file scope, external linkage, and static storage duration.”对比翻译过来的中文,应该没出什么大差错,所以我疑问不解,也就是说不管中文还是英文,就这句话而言,不存在“外部链接的静态变量”?

#3


疑问:具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。1楼的例子代码很赞啊!

#4


所以说:
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”

#5


引用 4 楼 zhao4zhong1 的回复:
所以说:
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”

老师,关于“标识符的链接、作用域和存储期”这3个我已经弄明白啦,就是在纠结“具有外部链接的静态变量”这个东西,不知道他到底是什么样的东西,感谢2位指点,了解了!

#6


我最近也在看,static表示的并不是静态存储时期,表示的是在文件作用域情况下是内部链接的,不加static的文件作用域就是外部链接。。。。。。。还有加static的块作用域是空连接,,,,,,,所谓的静态存储时期指的是变量的存储位置不变。希望对你有帮助。

#7


static一定是静态存储时期的变量,但静态变量不一定都是用static表示的,所以具有外部链接的静态变量就是指具有文件作用域不加staitic限定的变量。