在a.cpp中namespace A{ static int test_A =10; },而main.cpp中namespace A{ extern int test_A; },能否将a.cpp链接到main.cpp中,举个例子
时间: 2024-05-10 10:17:55 浏览: 73
可以将a.cpp链接到main.cpp中,举个例子如下:
a.cpp文件中的代码:
```cpp
namespace A{
static int test_A = 10;
}
```
main.cpp文件中的代码:
```cpp
#include <iostream>
namespace A{
extern int test_A;
}
int main(){
std::cout << "test_A = " << A::test_A << std::endl;
return 0;
}
```
编译链接命令:
```
g++ -c a.cpp
g++ -o main main.cpp a.o
```
运行结果:
```
test_A = 10
```
在main.cpp中,我们使用了`extern int test_A`来声明变量`test_A`,这表示在其他文件中已经定义了这个变量。然后我们在a.cpp中定义了`test_A`变量,最后将a.cpp编译成目标文件a.o,并将其与main.cpp一起链接生成可执行文件main。在运行时,我们可以看到输出了变量`test_A`的值10。
相关问题
在文件a中namespace A{ static int test_A =10; },而文件b中namespace A{ extern int test_A; },能否将文件a和文件b进行链接,举个例子
可以将文件a和文件b进行链接,只需要在另一个文件中定义namespace A,并且包含文件a和文件b即可。下面是一个例子:
假设我们有文件a.cpp和文件b.cpp,它们分别包含以下代码:
a.cpp:
```
namespace A {
static int test_A = 10;
}
```
b.cpp:
```
namespace A {
extern int test_A;
}
void foo() {
std::cout << A::test_A << std::endl;
}
```
然后我们可以在另一个文件中定义namespace A,并且将a.cpp和b.cpp链接起来:
main.cpp:
```
#include <iostream>
namespace A {
extern int test_A;
}
int main() {
std::cout << A::test_A << std::endl;
return 0;
}
```
编译命令可以是:
```
g++ -c -o a.o a.cpp
g++ -c -o b.o b.cpp
g++ -o main main.cpp a.o b.o
```
这样就可以将a.cpp和b.cpp链接到main中了。
文件a.cpp中的代码namespace A { static int a = 10;}和文件b.cpp中的代码namespace A { extern int a;}using namespace A;int main() { std::cout << a << std::endl; return 0;}中的a地址相同吗
不一定相同。因为 `namespace A` 中的 `static int a` 是一个内部链接的变量,只能在当前编译单元中使用,它对其他编译单元是不可见的。而 `namespace A` 中的 `extern int a` 是一个外部链接的变量,它可以在其他编译单元中定义,因此它的地址可能与 `static int a` 不同。在这种情况下,链接器会在链接时将 `extern int a` 与某个定义它的编译单元中的变量进行关联,假设在另一个文件c.cpp中有定义了 `int A::a = 20;`,那么在链接时 `extern int a` 就会与 `int A::a` 关联起来,它们最终会被分配到同一块内存地址。
阅读全文