在以下陈述中,前三个是定义,最后一个是声明:
auto int i;
static int j;
register int k;
extern int l;
原因是什么?
答案 0 :(得分:1)
前三个( int i,static int j,register int k )是一个定义。它表示整数在此转换单元中的空间,并建议链接器将对i的所有引用链接到该实体。如果您有多于或少于这些定义中的一个,链接器会抱怨。
但是在最后 extern int l 中,是一个声明,因为它只是引入/指定l,所以没有分配新的内存地址/空间。您可以根据需要在每个编译单元中包含尽可能多的extern int l。 声明将名称引入翻译单元或重新声明由先前声明引入的名称。
答案 1 :(得分:1)
我假设问题是关于C中的术语声明和定义。
声明告诉编辑器名称和类型" 某事"。
定义是一个声明,但另外"创建" " 某事"宣布的。例如。对于变量,这会为此变量引入一些存储空间。
在前三个示例中,实际创建了变量。存储类auto
,static
和register
都只指定存储持续时间。相反,存储类extern
告诉编译器该变量是已知的,但它可能存在于不同的翻译单元中。
也许比较函数的声明和定义的示例将使概念更容易理解:
// function declaration:
int foo(int x);
// (now we know a function foo should be "somewhere", but it doesn't exist yet)
// function definition:
int foo(int x) {
return x+1;
}