首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cpp文件间的extern变量和extern函数问题

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

Stack Overflow用户
提问于 2013-06-13 21:24:58
回答 1查看 229关注 0票数 1

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

在fileC.cpp中集成全局变量和全局函数时,我无法进行构建。但是它可以与fileB.cpp一起工作。

我已经尝试了许多组合,这样我就可以通过三个文件使用函数和变量?

代码语言:javascript
复制
//fileA.cpp

#include <fileC.cpp>

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

代码语言:javascript
复制
//fileB.cpp

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

代码语言:javascript
复制
//fileC.cpp

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-13 21:57:28

我同意Csaba Toth在评论中的观点。这是个烂摊子,你应该好好打扫。让让你参与项目的人相信,花点时间用合适的头和源文件重写它是值得的。它将为他们节省大量的开发和支持,并有助于在客户发现bug之前公开它。

话虽如此,你还是要处理好这件事。

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

选择2是在文件B中定义另一个静态int,这将是一个独立于C文件的int,它们可以有不同的值。

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

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

代码语言:javascript
复制
extern int dog;

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

您的选择3给出了问题,因为您有两个同名的全局范围变量。使用extern可以解决这个问题。

一般来说,良好的编码结构是:

头文件

  • 如果支持包装器,请确保有包装器( #ifdef MYFILE_H#pragma once ),以确保.h不能包含超过一次。
  • 只有put函数声明-您应该有非常少的实现,除非您急于使它内联(现在好的编译器可以自己优化罚款在大多数情况下)。您应该确保实现的任何函数都是该文件的内部函数,并且不依赖于其他文件。
  • 您可以使用extern引用其他文件全局变量。

Cpp文件

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

我猜,从你没有在选择1和选择2中提到任何错误的事实来看,你已经编译了,但是从来没有运行链接器。我接下来的猜测是,这是一个unix系统,因为同时处理了这两个步骤。在这种情况下,必须有一些make系统来负责构建,或者什么的。你的三种选择都应该有错误。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17097347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档