Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ cpp文件之间的extern变量和extern函数问题_C++ - Fatal编程技术网

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

C++ cpp文件之间的extern变量和extern函数问题,c++,C++,**这是一个大型项目,只是一个抽象概念** 在fileC.cpp中合并全局变量和全局函数时,我无法生成。 但是它可以与fileB.cpp一起工作 我已经尝试了许多组合,以便我可以通过3个文件使用函数和变量 //fileA.cpp #include <fileC.cpp> extern int dog; extern void myFunc(int junk) { //some stuff } 我同意Csaba Toth的评论。这是一团乱,你应该好好打扫。说服让你参与项

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

在fileC.cpp中合并全局变量和全局函数时,我无法生成。 但是它可以与fileB.cpp一起工作

我已经尝试了许多组合,以便我可以通过3个文件使用函数和变量

//fileA.cpp

#include <fileC.cpp>

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


我同意Csaba Toth的评论。这是一团乱,你应该好好打扫。说服让你参与项目的人,花时间用合适的头文件和源文件重写项目是值得的。这将为他们节省大量的开发和支持,并有助于在客户发现错误之前暴露错误

也就是说,你仍然需要和外人打交道

你的选择很差。cpp不应包括另一个.cpp。你没有得到大量“已经定义”的错误,这简直是奇迹

选项2是在文件B中定义另一个静态ish int。这将是与文件C中的int不同的int,并且它们可以有不同的值

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

因此,在B的某些部分中,执行以下操作:

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

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

通常,良好的编码结构应为:

头文件
  • 确保有包装器,如果支持的话,可以是
    #ifdef MYFILE_H
    #pragma一次
    ,以确保.H不能包含一次以上
  • 只放函数声明——除非你非常想把它内联(现在好的编译器可以在大多数情况下自行优化),否则你应该只有很少的实现。您应该确保您实现的任何函数都只是该文件的内部函数,而不依赖于其他文件
  • 您可以使用
    extern
    引用其他文件全局变量
Cpp文件 最干净的事情是匹配头中的实现,尽管编译器和链接器可以让您在任何地方实现任何东西。遵循的主要规则是,在所有代码中,每个函数和每个外部函数都只能实现一次。应该只有一个位置具有函数
myFunc
,并且应该只有一个位置声明
int dog
,而不是
extern int dog
。函数声明和
extern
变量都告诉编译器“别担心,我会确保它完成的”,然后链接器在所有对象中查找它


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

#包括
?沃特?从技术上讲,你可以这样做,但实际上并不建议这样做。为
fileA.cpp
创建适当的
fileA.h
头文件,并将其包含到fileB.cpp和fileC.cpp中。总是保持你的包裹整洁,否则你会带来混乱。。。它包括文件。。。这是一个我正在加入的大型项目。包括在之前设置。我只是想弄清楚如何跨多个文件使用全局变量和函数。现在是
#include
。同样的事情。只包括头文件。不一样的事情。。。它不会建造!同样的道理,这是一个很大的禁忌。你必须有这些文件:fileA.cpp和合适的fileA.h,fileB.cpp和fileC.cpp,它们都包括fileA.h。在你做对这件事之前,你只会胡闹。是的,它是Linux。fileA到fileB可以工作,但无法让fileC工作。已尝试使用fileB来包含“extern”。。。不走运。同样,这是遗留代码,那些#include是我无法更改的。注意,这是一个抽象,实际上有数百个文件。今后我会记住这一点。thxSo文件B和文件C还有很多其他的包含吗?不幸的是,它可能是一个太大的意大利面条解开它。尽量更具体地处理这些文件以及您收到的确切错误消息。您是否只有这一个错误或有许多其他错误?只是一个简短的总结,尽管您可能已经理解了这一点:如果您试图访问已在fileC中的全局函数,请在其他文件中声明该函数,例如,
void myFunc(int)(不需要外部代码)。如果试图访问全局变量,则需要
extern int dog//fileC.cpp

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