在纯C中的静态变量和extern
在上述代码中,首先定义了一个名为SoTest的类,其中包含一个构造函数,构造函数用于打印对象的地址信息。然后在类的外部定义了一个名为CStaticObj的静态变量,并在main函数之前进行了初始化。接着,在类的内部定义了一个名为ClassStaticObj的静态变量,并在main函数之前进行了初始化。在function函数中,定义了一个名为FunctionStaticObj的静态变量,并在每次调用函数时进行初始化。此外,还定义了一个名为FunctionObj的局部变量,在每次调用函数时进行初始化。
运行代码后,可以看到以下输出:
C'tor called of CStaticObj (0x419168) object
C'tor called of ClassStaticObj (0x419169) object
enter main
C'tor called of FunctionStaticObj (0x419160) object
C'tor called of FunctionObj (0x12fe77) object
C'tor called of FunctionObj (0x12fe77) object
C'tor called of FunctionObj (0x12fe77) object
C'tor called of FunctionObj (0x12fe77) object
现在我们来回答一下问题:
1. 在函数外部声明静态变量和在函数内部声明静态变量有什么区别?
答:这两个操作完全不同。在函数外部声明的静态变量在编译单元之外不可见。而在函数内部声明的静态变量分配在全局数据中,并且只在第一次出现时初始化。
2. 声明变量为static和声明变量为extern有什么区别?
答:static表示该变量在编译单元之外不可见。而extern表示“它在这里没有定义,但在不同的编译单元中有定义,链接器会处理它”,因此可以进行多次extern声明,但只能有一个非extern定义。
静态变量和extern在C语言中的使用和区别已经解释清楚了。
在C语言中,static变量和extern变量的区别在于,函数内部的static变量只能在函数内部访问,而函数外部的static变量可以被从声明点到文件末尾的任何函数访问。
如果在函数外部声明一个没有static关键字的变量,那么它可以在定义所在的文件(翻译单元)之外被访问(可访问性)。如果将变量声明为extern,意味着它在其他地方有一个定义 - 可能是在同一翻译单元中,但更可能是在另一个翻译单元中。注意,可以在函数内部声明extern变量,但它只能在函数外部定义。
实际上,static关键字的作用是将变量的作用域限制在声明它的函数或文件内部,这样可以避免变量与其他文件中的同名变量冲突。而extern关键字的作用是声明一个变量的存在,并告诉编译器该变量在其他地方有一个定义。
问题的出现是因为程序员需要在不同的函数或文件中共享变量,但又不希望这些变量被其他函数或文件访问。解决方法是使用static关键字将变量的作用域限制在声明它的函数或文件内部,这样就可以实现变量的私有性。另一种解决方法是使用extern关键字来声明变量,并在其他地方进行定义,这样就可以实现变量的共享性。
以下是使用static和extern关键字的示例代码:
// File1.c #includestatic int count = 0; // 只能在File1.c中访问 void increment(void) { count++; printf("Count: %d\n", count); } // File2.c #include extern int count; // 表示count变量在其他地方有一个定义 void decrement(void) { count--; printf("Count: %d\n", count); } int main() { increment(); // 输出:Count: 1 decrement(); // 输出:Count: 0 return 0; }
在上面的示例代码中,count变量被声明为static,这意味着它只能在File1.c文件中访问。increment函数可以访问和修改count变量,而decrement函数通过extern关键字声明了count变量的存在,并可以在其他地方进行定义。在main函数中,我们可以通过调用increment和decrement函数来操作count变量,并输出结果。
通过使用static和extern关键字,我们可以在C语言中实现变量的私有性和共享性,从而更好地组织和管理代码。