**这是一个大项目,这只是一个抽象**
在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
答案 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
来引用其他文件全局变量。最干净的事情是匹配标题中的实现,尽管编译器和链接器可以让你在任何地方实现任何东西。遵循的主要规则是每个函数和每个extern在所有代码中实现一次且仅执行一次。只应该有一个功能myFunc
的地方,并且应该只有一个地方声明int dog
而不是extern int dog
。函数声明和extern
变量都告诉编译器“不要担心这个,我会确保它已经完成”,然后链接器在所有对象中查找它。
我猜,从你没有在你的选择1和选择2中提到任何错误的事实,你得到了编译,但从未运行过链接器。我的下一个猜测是这是一个unix系统,因为Visual Studio会同时处理这两个步骤。在这种情况下,必须有一些make
系统来处理建筑或其他事情。你应该在所有三个选择中都有错误。