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

标签 c++ header scope

我有一个程序,除了 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/

相关文章:

c++ - 用于放入在一组函数中传递的参数的结构

c++ - 可破坏的网格 block 会导致奇怪的碰撞

c++ - 为什么我们不能声明一个 std::vector<Abstract Class>?

css - 创建具有固定标题的 css 可滚动表

jquery - jQuery Mobile 中的持久 header

c++ - 翻译单元如何访问另一个翻译单元的全局范围?

C++:隐藏一些函数

scope - 在 CDI Weld 中查看范围

C++ 模板和运算符重载

C++ 将数组传递给方法问题