** 这是一个大项目,这只是一个抽象 **
在 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
最佳答案
我同意 Csaba Toth 的评论。这是一团糟,你应该好好清理它。让让你加入项目的人相信花时间用适当的头文件和源文件重写它是值得的。这将为他们节省大量的开发和支持工作,并有助于在客户发现之前发现错误。
也就是说,您仍然需要处理外部。
您的选择 1 很差。 .cpp 不应包含另一个 .cpp。没有出现大量“已定义”错误简直就是奇迹。
选项 2 在文件 B 中定义另一个静态 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文件
最干净的方法是匹配 header 中的实现,尽管编译器和链接器可以让您在任何地方实现任何东西。要遵循的主要规则是每个函数和每个 extern 在所有代码中只实现一次。函数 myFunc
应该只有一个地方,并且应该只有一个地方声明 int dog
而不是 extern int dog
。函数声明和 extern
变量都告诉编译器“不用担心,我会确保完成”,然后链接器会在所有对象中查找它。
我猜,从您没有在选项 1 和选项 2 中提到任何错误这一事实来看,您已经进行了编译,但从未运行过链接器。我的下一个猜测是这是一个 unix 系统,因为 Visual Studio 会同时处理这两个步骤。在那种情况下,必须有一些 make
系统来负责构建或其他事情。您的所有三个选择都应该有错误。
关于c++ - cpp文件之间的外部变量和外部函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17097347/