1

以下声明是否正确?

在任何功能之外:

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
4

3 回答 3

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 从其他文件访问全局变量,前提是它们没有像上面的示例中那样显式声明为静态的。

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

最后,如果您还不熟悉这篇文章,您可能希望涵盖各个级别的范围。它可能会对您有所帮助和信息丰富。祝你好运!

术语定义 - C 应用程序中的范围

在我看来,回答我这个关于范围问题的人做得很好。

此外,如果您在函数中声明静态内容,则该值将保留在函数调用之间。

例如:

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

请注意,在函数中使用静态变量具有特定且数量有限的有用情况,并且对于大多数项目通常不是一个好主意。

于 2012-05-04T19:57:16.020 回答
1

您的一个误解似乎externstatic. 不是这种情况。你有这个:

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.

于 2012-05-04T19:46:33.247 回答
1

您必须将存储持续时间和链接的概念分开。externstatic,在各种情况下,可以对这些属性和其他效果产生影响,但不是其中任何一个的唯一决定因素。

在文件范围内


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;

定义。静态存储时长,无联动。(同样,不是很有用!)

于 2012-05-04T20:23:32.617 回答