以下声明是否正确?
在任何功能之外:
int a; //external by default
extern int a; //explicitly extern
static int a; //explicity static
const int a; //static by default
static const int a; //explicitly static
extern const int a; //explicitly extern
在函数内部:
int a; //auto by default
static in a; //explicity static
const int a; //static by default
static const int a; //explicitly static
答案 0 :(得分:2)
关闭。
默认情况下,全局范围内的任何内容(即:函数外部)都是静态的。
例如:
//main.c
int myVar; // global, and static
int main(void) {
...
return 0;
}
//morecode.c
extern int myVar; //other C files can see and use this global/static variable
但是,如果您在全局范围内显式声明某些内容为静态,那么它不仅是静态的,而且只在该文件中可见。其他文件无法看到它。
//main.c
static int myVar; // global, and static
int main(void) {
...
return 0;
}
//morecode.c
extern int myVar; // compiler error; "myVar" can only be seen by
// code in main.c since it was explicitly
// declared static at the global scope
此外,默认情况下,没有任何“extern”。您通常使用extern从其他文件访问全局变量,前提是它们没有显式声明为静态,如上例所示。
const只表示无论数据范围如何,数据都无法更改。它并不意味着外在或静态。有些东西可以是“extern const”或“extern”,但“extern static”并不真正有意义。
作为最后一个例子,这段代码将构建在大多数编译器上,但它有一个问题:myVar总是被声明为“extern”,即使在技术上创建它的文件中也是如此。不好的做法:
//main.c
extern int myVar; // global, and static, but redundant, and might not work
// on some compilers; don't do this; at least one .C file
// should contain the line "int myVar" if you want it
// accessible by other files
int main(void) {
...
return 0;
}
//morecode.c
extern int myVar; //other C files can see and use this global/static variable
最后,如果您还不熟悉它们,您可能希望在不同级别的范围内介绍此帖子。它可能对您有所帮助和信息。祝你好运!
Terminology definition - Scope in C application
在我看来,在范围内回答我这个问题的人做得很好。
此外,如果在函数内声明静态,则值仍保留在函数调用之间。
例如:
int myFunc(int input) {
static int statInt = 5;
printf("Input:%d statInt:%d",input,statInt);
statInt++;
return statInt;
}
int main(void) {
myFunc(1);
myFunc(5);
myFunc(100);
return 0;
}
<强>输出:强>
Input:1 statInt:0
Input:5 statInt:1
Input:100 statInt:2
请注意,在函数中使用静态变量具有特定且有限数量的有用的情况,对于大多数项目而言通常不是一个好主意。
答案 1 :(得分:1)
您似乎有一种误解,extern
与static
相反。不是这种情况。你有这个:
int a; //extern by default
这不是“默认的外部”。 extern
声明意味着实际的变量定义在别处。所以如果你的源文件中有这个:
extern int a;
然后在其他地方你有另一个源文件:
int a;
否则,如果您编译代码,您将获得:
/tmp/cc3NMJxZ.o: In function `main':
foo.c:(.text+0x11): undefined reference to `a'
collect2: ld returned 1 exit status
函数定义之外的 static
表示该变量仅对同一文件中定义的其他代码可见。缺少static
意味着变量对于可能链接到目标文件的代码是全局可见的。
我不太确定,但我不相信const
暗示static
。这不应该太难测试。
......事实上,一个非常简单的测试证实const
并不意味着static
。
答案 2 :(得分:1)
您必须将存储持续时间和链接的概念分开。在各种情况下,extern
和static
可以对这些属性和其他效果产生影响,但不是其中任何一个的唯一决定因素。
在档案范围
int a;
这是一个暂定的定义。 a
具有静态存储持续时间和外部链接。
extern int a;
声明但不是定义。静态存储持续时间和外部链接(或者如果一个可见,则由先前声明确定的链接)。
static int a;
暂定的定义。静态存储持续时间和内部联系。
const int a;
暂定声明。静态存储持续时间和外部链接(与C ++不同)。
static const int a;
暂定的定义。静态存储持续时间和内部联系。
extern const int a;
声明而非定义。静态存储持续时间和外部链接(或者如果一个可见,则由先前声明确定的链接)。
在块范围内
int a;
定义。自动存储持续时间,无连接。
static int a;
定义。静态存储持续时间,没有链接。
const int a;
定义。自动存储持续时间,无连接。
(我认为这是严格合法的,但不是很有用,因为你不能修改a
的不确定初始值而不会导致未定义的行为。)
static const int a;
定义。静态存储持续时间,没有链接。 (再次,不是很有用!)