C++在a.cpp中调用函数aa初始化local static对象,之后在b.cpp中调用函数aa初始化local static对象,并将两个文件链接在一起,那么这两个对象的地址相同吗,举个例子
时间: 2023-06-25 13:01:54 浏览: 97
在C++中,local static对象是在第一次调用该函数时进行初始化的,而且它们的初始化顺序是不确定的。因此,如果你在a.cpp和b.cpp中都定义了一个名为aa的函数,并且这两个函数都包含了定义local static对象的代码,那么这两个对象的地址可能相同,也可能不同,这取决于它们的初始化顺序。
举个例子,假设a.cpp中的aa函数定义如下:
```c++
#include <iostream>
void aa()
{
static int a = 1;
std::cout << "a in aa() is located at " << &a << std::endl;
}
```
而b.cpp中的aa函数定义如下:
```c++
#include <iostream>
void aa()
{
static int a = 2;
std::cout << "a in aa() is located at " << &a << std::endl;
}
```
然后,我们将这两个文件链接在一起,并运行程序:
```
g++ a.cpp b.cpp -o test
./test
```
输出如下:
```
a in aa() is located at 0x561c5b500028
a in aa() is located at 0x561c5b50002c
```
可以看到,这两个local static对象的地址不同。但是,这并不能保证在其他系统或编译器上也是这样的,因为每个编译器和系统对于local static对象的初始化顺序都有自己的规定。因此,最好避免在不同文件中定义同名的local static对象,以免出现不可预测的行为。
阅读全文