gpt4 book ai didi

c++ - 多文件程序中的作用域

转载 作者:行者123 更新时间:2023-11-30 00:55:05 30 4
gpt4 key购买 nike

我有一个程序,除了 main.cpp 和一个常量头之外,还有两个外部文件。所以总共有四个文件。它们包含以下代码:

主要.cpp

#include <iostream>
using namespace std;

int ext1_func();
int ext2_func();

int main()
{
int i;
i = ext1_func();
cout << i << endl;

i = ext2_func();
cout << i << endl;

return 0;
}

ext1.cpp

#include "const.h"
int asd1=1;

int ext1_func()
{
return temp_int;

}

ext2.cpp

#include "const.h"
int asd2 = 2;

int ext2_func()
{
return temp_int;
}

常量.h

#ifndef CONST_H
#define CONST_H

const int temp_int=1;

#endif

我想要的是:

1) 在 ext1.cpp 中声明的任何变量都应该为 ext1.cpp 中的函数所知,对于 ext2.cpp 也是如此。因此,对于“ext2_func”,“asd1”必须只为“ext1_func”和“asd2”所知。

2) "exp1.cpp"和 "ext2.cpp"中的函数必须能够看到 "const.h"中定义的所有值

我相信我编写并附上的代码满足这些要求,但我想问一下我做的是否正确?有没有比我建议的方法更容易获得所需行为的方法?

提前致谢。

奈尔斯。

最佳答案

在编译单元级别,您在“全局”范围声明的符号都链接到全局变量空间。

避免这种情况的旧方法是将它们声明为静态的。新的方法是将它们放入一个匿名命名空间中。它们也可以在那里被声明为静态的。

ext1.cpp

namespace {
/*static*/ int asd1=1;
}

header中的const是可以的,这样声明的常量有一个特殊的地位,事实上编译器可以在代码中替换这个值。但理想情况下,您至少应该将它们包装在一个(命名的)命名空间中,以避免污染全局命名空间。修改值(使用 const_cast)将是未定义的行为。

如果它是非常量并且您真的想要一个全局的(通常不是一个好主意)您需要在 header 中使用 extern 关键字,然后在单个编译单元中创建它的实例。

关于c++ - 多文件程序中的作用域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12953264/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com