2012-06-22 448 views
4

它使在C99任何区别,当一个在*.h)文件写入const int x = 1;static const int x = 1;静态常量

+0

我通常预先准备的静态标识符的功能initializate一个变量,所以在第一次调用该功能可按后,任何其他调用不会再次重新初始化该变量。如果尝试重新初始化变量,该变量就像一个常量。如果你的变量被声明为const,你永远不能修改它。 –

回答

2

正如cdarke说的那样,它有所不同。

const int x = 1;为包含h文件的每个模块创建一个链接器可见符号。
链接器应该停止并返回一个错误,因为同一个符号有多个(可见的)定义。

static const int x = 1;为每个模块创建一个变量但不包含链接器符号,包括您​​的h文件。
链接器可以链接代码,但是当您创建具有相同名称的变量的多个实例时,它不确定您的代码是否按预期工作。

Btw。在h文件中定义一个变量是一个绝对不好的主意,标准的方法是在c文件中定义它们,并且只在h文件中声明它们(如果你真的需要访问它们)。

当您只想在一个模块中使用变量时,您可以使用static,并且它应该对所有其他人不可见。
const ...只有当你真的需要从另一个模块访问它,但恕我直言,你通常应该避免全球访问变量。

myfile.c文件

#include "myFile.h" 
const int x=1; 
static const int y=2; 

myFile.h

extern const int x; 
+0

就我个人而言,我不认为在头文件中定义一个“static const int”是一个“绝对不好”的想法。它只是在C语言中通常毫无意义 - 几乎所有的用途都是'#define'或枚举类型,并且有些东西可以使用'#define'/enum,因为你不能使用' static const int',比如一个struct的数组成员的大小。头文件中的非常量对象可能难以证明:-) –

+0

@Steve - 是的,我特别想到非const对象 – jeb

3

是的。首先,我不建议你将这些定义放在一个头文件中,但是如果你这样做,则取决于包含头文件的位置。无论如何,static使当前程序单元的本地变量。这里有一个例子:

mp1.c:

#include <stdio.h> 

void myfunc(void); 

const int x = 1; 

int main (int argc, char *argv[]) 
{ 
    printf ("main: value of x: %d\n",x); 
    myfunc(); 
    return 0; 
} 

mp2.c:

#include <stdio.h> 

extern int x; 

void myfunc(void) 
{ 
    printf ("myfunc: value of x: %d\n",x); 
} 

编译:

gcc -o mp mp1.c mp2.c 

工作正常。现在改变mp1.c使用static const int x = 1;当我们编译(实际上它的链接错误),我们得到:

home/user1> gcc -o mp mp1.c mp2.c 
/tmp/ccAeAmzp.o: In function `myfunc': 
mp2.c:(.text+0x7): undefined reference to `x' 
collect2: ld returned 1 exit status 

变量x不mp1.c.的外部可见

这同样适用于static前缀函数。