extern可以使用static修饰的变量吗
时间: 2023-11-21 11:04:21 浏览: 93
可以,但是没有意义。
extern关键字用于声明一个变量或函数是在其他文件中定义的,该变量或函数的实际定义在其他文件中。而static关键字用于将变量或函数的作用域限制在定义它们的文件中,使它们对其他文件不可见。
因此,用extern修饰的变量必须在其他文件中定义,而不能是static变量。反之,如果变量是static的,则在其他文件中使用extern没有任何意义,因为该变量已经被限制在定义它的文件中。
相关问题
修饰词static与extern在作为变量的修饰词时功能正好相反, 前者只能修饰局部变量,后者只能修饰全局变量
这句话有误。实际上,`static` 和 `extern` 都可以修饰局部变量和全局变量,只是它们的作用不同。
`static` 修饰的变量会被分配在静态存储区,其生命周期与程序运行期间一致,不会随着函数的结束而销毁,可以用于保持变量的值不变或者限制变量的作用域。
`extern` 修饰的变量则是声明一个全局变量,这个变量可能在其他文件中定义,使用 `extern` 声明可以让当前文件访问到这个变量。
因此,`static` 和 `extern` 的作用是不同的,但都可以修饰局部变量和全局变量。
static修饰的全局变量在其他文件中使用extern声明再使用提示未定义错误
静态全局变量(static variables declared at file scope)在C++中,如果要在其他源文件中使用,通常不需要使用`extern`关键字,因为静态变量默认就是外部可见的。当你在一个头文件(`.h`)中声明了一个静态变量,比如:
```cpp
// file1.h
class MyClass {
public:
static int globalVar;
};
```
然后在某个源文件(`file1.cpp`)中初始化它:
```cpp
// file1.cpp
#include "file1.h"
MyClass::globalVar = 0; // 初始化全局变量
```
此时,在另一个源文件(`file2.cpp`)中可以直接引用这个全局变量,无需额外声明`extern`:
```cpp
// file2.cpp
#include "file1.h"
```
然而,如果你在`file2.cpp`里试图直接访问`globalVar`而没有初始化,编译器可能会报“未定义”的错误,因为你尚未在该文件中提供对这个全局变量的初始化。在这种情况下,你需要确保每个使用到静态全局变量的地方都进行了正确的初始化,或者将初始化移到了合适的公共区域(如`main()`函数前)。如果需要在多个源文件之间共享状态,可能需要考虑使用全局变量、单例模式或者命名空间等设计模式。
阅读全文