cpp文件之间的extern变量和extern函数问题

时间:2013-06-13 21:24:59

标签: c++

**这是一个大项目,这只是一个抽象**

在fileC.cpp中合并全局变量和全局函数时,我无法构建。 但它适用于fileB.cpp就好了。

我尝试过多种组合,以便通过3个文件使用函数和变量???

//fileA.cpp

#include <fileC.cpp>

extern int dog;
extern void myFunc(int junk)
{
    //some stuff
}

//fileB.cpp

//Unsure of the connections but fileA works fine with fileB    
int dog;
void myFunc(int); //no issues here

//fileC.cpp

int dog;
void myFunc(int);//causes issues with building

1 个答案:

答案 0 :(得分:2)

我同意Csaba Toth的评论。这是一团糟,你应该妥善清理它。说服那些让你参与项目的人,值得花些时间用合适的标题和源文件重写它。它将为他们节省大量的开发和支持,并有助于在客户发现错误之前揭露错误。

那就是说,你还需要处理外部事件。

你的选择1很差。 .cpp永远不应该包含另一个.cpp。只是没有一个奇迹,你没有得到大量“已经定义”的错误。

选择2是在文件B中定义另一个static-ish int。这将是与文件C中的单独的int,它们可以具有不同的值。

您需要做的是将文件C的int声明为extern。您可以在标题或cpp中执行此操作。诀窍是确保它只在一个地方实例化。

所以,在B的某些部分,这样做:

extern int dog;

这告诉编译器在程序准备运行时会有一个名为dog的int。然后,链接器将查找该变量的唯一一个实例 - 当前驻留在fileC.cpp中 - 并将所有内容指向同一位置。

您的选择3给您带来了问题,因为您有两个同名的全局范围变量。使用extern将解决此问题。

通常,良好的编码结构将是:

头文件

  • 确保包含#ifdef MYFILE_H#pragma once包装(如果支持),以确保.h永远不会包含多次。
  • 只放置函数声明 - 你应该只有很少的实现,除非你急于使它内联(现在好的编译器可以在大多数情况下自行优化)。您应该确保您实现的任何功能仅在该文件内部,并且不依赖于其他文件。
  • 您可以使用extern来引用其他文件全局变量。

Cpp文件

最干净的事情是匹配标题中的实现,尽管编译器和链接器可以让你在任何地方实现任何东西。遵循的主要规则是每个函数和每个extern在所有代码中实现一次且仅执行一次。只应该有一个功能myFunc的地方,并且应该只有一个地方声明int dog而不是extern int dog。函数声明和extern变量都告诉编译器“不要担心这个,我会确保它已经完成”,然后链接器在所有对象中查找它。

我猜,从你没有在你的选择1和选择2中提到任何错误的事实,你得到了编译,但从未运行过链接器。我的下一个猜测是这是一个unix系统,因为Visual Studio会同时处理这两个步骤。在这种情况下,必须有一些make系统来处理建筑或其他事情。你应该在所有三个选择中都有错误。