**这是一个大型项目,这只是一个抽象**
在fileC.cpp中集成全局变量和全局函数时,我无法进行构建。但是它可以与fileB.cpp一起工作。
我已经尝试了许多组合,这样我就可以通过三个文件使用函数和变量?
//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发布于 2013-06-13 21:57:28
我同意Csaba Toth在评论中的观点。这是个烂摊子,你应该好好打扫。让让你参与项目的人相信,花点时间用合适的头和源文件重写它是值得的。它将为他们节省大量的开发和支持,并有助于在客户发现bug之前公开它。
话虽如此,你还是要处理好这件事。
你的选择1很差。.cpp不应该包含另一个.cpp。这是一个奇迹,你没有得到大量的“已经定义的”错误。
选择2是在文件B中定义另一个静态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文件
最干净的事情是匹配来自头的实现,尽管编译器和链接器可以让您在任何地方实现任何东西。要遵循的主要规则是,每个函数和每个外部都在所有代码中实现一次,而且只有一次。应该只有一个带有函数myFunc的地方,而应该只有一个声明int dog而不是extern int dog的地方。函数声明和extern变量都告诉编译器“不用担心,我会确保它已经完成”,然后链接器会在所有对象中查找它。
我猜,从你没有在选择1和选择2中提到任何错误的事实来看,你已经编译了,但是从来没有运行链接器。我接下来的猜测是,这是一个unix系统,因为同时处理了这两个步骤。在这种情况下,必须有一些make系统来负责构建,或者什么的。你的三种选择都应该有错误。
https://stackoverflow.com/questions/17097347
复制相似问题