1

除了 main.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 也是如此。所以“asd1”必须只有“ext1_func”知道,“asd2”只能知道“ext2_func”。

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

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

提前致谢。

奈尔斯。

4

4 回答 4

2

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

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

ext1.cpp

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

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

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

于 2012-10-18T11:17:23.977 回答
2

我不会在 main.cpp中重复ext1_func()ext2_func()原型,而是为每个函数定义一个头文件,并在那里添加函数原型:

// ext1.h
#ifndef EXT1_H_INCLUDED
#define EXT1_H_INCLUDED

int ext1_func();

#endif // EXT1_H_INCLUDED


// ext2.h
#ifndef EXT2_H_INCLUDED
#define EXT2_H_INCLUDED

int ext2_func();

#endif // EXT2_H_INCLUDED

在 main.cpp 中:

#include "ext1.h"
#include "ext2.h"

在 ext1.cpp 和 ext2.cpp 中,仅对源文件本地的变量使用匿名命名空间:

// ext1.cpp
#include "const.h"
#include "ext1.h"

namespace {

int asd1=1;

} // anonymous namespace


int ext1_func()
{
   return temp_int;   
}

与 ext_2.cpp 类似。

您可能还想#pragma once在头文件中使用方便,而不是#ifndef/#define包含保护。

于 2012-10-18T11:18:47.313 回答
1

您应该将变量定义为ext1.cppext2.cpp是静态的,以防止它们被其他文件看到。但是,这是一种非常糟糕的构建方式。相反,您应该将代码分成不同的类。有关详细信息,请参阅

于 2012-10-18T11:14:28.300 回答
1

当您想将变量设置为翻译单元(.cpp文件)的本地变量时,您可以将它们放入匿名命名空间中,如下所示:

namespace
{
    int local_variable = 1;
}

或者你也可以用旧的 C 方式来做:

static int local_variable = 1;

此外,您不应该在头文件中定义变量,因为它将在.cpp包含此头文件的每个模块中重复。你应该像这样在外部声明它const.h

extern int external_variable;

然后在相应的const.cpp文件中定义如下:

int external_variable = 1;
于 2012-10-18T11:18:57.910 回答