静态变量是用static来声明,一个文件作用域变量具有内部链接还是外部链接,看在外部定义中是否使用了存储类说明符static,使用了static是内部链接。
疑问:静态变量中的static已经决定了一个变量是内部链接,书上的“具有外部链接的静态变量”这不是矛盾吗?
7 个解决方案
#1
我就说,有些教程看上去通俗易懂,却只会把问题越说越糊涂。
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对CPP印象挺好(虽然我只是大致翻了翻),但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题?
它应该这样说:“具有文件作用域的标识符是外部链接的,它所指示的对象具有静态存储期。”
顺便说一句,同样是static,它的位置不同,意义也不同:
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对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
非常感谢你的解答,英文的原话是:“A static variable with external linkage has file scope, external linkage, and static storage duration.”对比翻译过来的中文,应该没出什么大差错,所以我疑问不解,也就是说不管中文还是英文,就这句话而言,不存在“外部链接的静态变量”?
#3
1楼的例子代码很赞啊!
#4
所以说:
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”
#5
老师,关于“标识符的链接、作用域和存储期”这3个我已经弄明白啦,就是在纠结“具有外部链接的静态变量”这个东西,不知道他到底是什么样的东西,感谢2位指点,了解了!
#6
我最近也在看,static表示的并不是静态存储时期,表示的是在文件作用域情况下是内部链接的,不加static的文件作用域就是外部链接。。。。。。。还有加static的块作用域是空连接,,,,,,,所谓的静态存储时期指的是变量的存储位置不变。希望对你有帮助。
#7
static一定是静态存储时期的变量,但静态变量不一定都是用static表示的,所以具有外部链接的静态变量就是指具有文件作用域不加staitic限定的变量。
#1
我就说,有些教程看上去通俗易懂,却只会把问题越说越糊涂。
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对CPP印象挺好(虽然我只是大致翻了翻),但这句“具有外部链接的静态变量具有文件作用域、外部链接和静态存储时期。”让我恶心了。也许是翻译的问题?
它应该这样说:“具有文件作用域的标识符是外部链接的,它所指示的对象具有静态存储期。”
顺便说一句,同样是static,它的位置不同,意义也不同:
标识符的链接、作用域和存储期是非常容易混淆的东西。
我本来对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
非常感谢你的解答,英文的原话是:“A static variable with external linkage has file scope, external linkage, and static storage duration.”对比翻译过来的中文,应该没出什么大差错,所以我疑问不解,也就是说不管中文还是英文,就这句话而言,不存在“外部链接的静态变量”?
#3
1楼的例子代码很赞啊!
#4
所以说:
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”
千万字的解释不如举一个实际例子。
说是一物即不中。
“盲人摸太阳”
#5
老师,关于“标识符的链接、作用域和存储期”这3个我已经弄明白啦,就是在纠结“具有外部链接的静态变量”这个东西,不知道他到底是什么样的东西,感谢2位指点,了解了!
#6
我最近也在看,static表示的并不是静态存储时期,表示的是在文件作用域情况下是内部链接的,不加static的文件作用域就是外部链接。。。。。。。还有加static的块作用域是空连接,,,,,,,所谓的静态存储时期指的是变量的存储位置不变。希望对你有帮助。
#7
static一定是静态存储时期的变量,但静态变量不一定都是用static表示的,所以具有外部链接的静态变量就是指具有文件作用域不加staitic限定的变量。