它使在C99
任何区别,当一个在头(*.h
)文件写入const int x = 1;
与static const int x = 1;
?静态常量
静态常量
回答
正如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;
就我个人而言,我不认为在头文件中定义一个“static const int”是一个“绝对不好”的想法。它只是在C语言中通常毫无意义 - 几乎所有的用途都是'#define'或枚举类型,并且有些东西可以使用'#define'/enum,因为你不能使用' static const int',比如一个struct的数组成员的大小。头文件中的非常量对象可能难以证明:-) –
@Steve - 是的,我特别想到非const对象 – jeb
是的。首先,我不建议你将这些定义放在一个头文件中,但是如果你这样做,则取决于包含头文件的位置。无论如何,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
前缀函数。
- 1. PHP5:常量vs静态
- 2. perl静态常量hashrefs
- 3. 上`静态常量WCHAR *`
- 4. 常量与静态只读
- 5. 静态常量定义类
- 6. 静态常量成员
- 7. 静态库和常量
- 8. 类中静态常量ODR
- 9. android-strings.xml vs静态常量
- 10. 差异静态常量和静态的返回时,一个静态变量
- 11. C#静态和常量变量内存
- 12. IOS公共静态常量当量
- 13. 重写一个静态常量变量
- 14. 引用父变量的静态常量
- 15. Objective-C静态常量变量
- 16. Java图标常量 - 静态常量是否正常?
- 17. “静态字符常量*常量”优于“静态常量字符”的关联对象键的优点是什么?
- 18. 在swift类的静态函数中访问非静态常量
- 19. 静态的常量成员,静态类和瓶颈
- 20. 如何创建静态NSString常量的静态NSString []?
- 21. 静态断言检查静态常量类数据成员?
- 22. 静态函数常量静态成员函数
- 23. 使用静态只读与静态获取器模仿常量
- 24. FieldOperator类不包含静态常量
- 25. 静态常量Vs定义指令
- 26. 静态常量类成员声明
- 27. 常量与保护静态只读
- 28. 怀疑与静态常量varaible
- 29. Java枚举与静态常量
- 30. 常量不能标记静态
我通常预先准备的静态标识符的功能initializate一个变量,所以在第一次调用该功能可按后,任何其他调用不会再次重新初始化该变量。如果尝试重新初始化变量,该变量就像一个常量。如果你的变量被声明为const,你永远不能修改它。 –