C ++中多个文件的声明/初始化问题

时间:2015-05-22 18:31:10

标签: c++ compilation linker header-files

我知道如何从第二个.cpp文件调用一个简单的函数(即add(int x, int y){return x+y;}而不是更多)。 现在我想更进一步,并得到以下问题: 在我的main.cpp中我得到了这样的一行(重要的部分是最后的变量 a_wt ):

transform(a_att.begin(), a_att.end(), a_att.begin(), std::bind1st(std::multiplies<float>(), a_wt));

所以,但是现在我得到了第二个.cpp文件,我在那里放了一大堆重复代码,要求在void函数中输入。 (你可以想象......&#34; apple_prize?&#34; cin&gt;&gt; ...&#34; cherry_prize?&#34; cin&gt;&gt; ... 很长时间以来我想把这个块放在一个额外的文件中以减轻main.cpp的可读性。在main()我的开头,然后写void prizes();以包含该过程)。 所以在第二个.cpp文件中就像std::cin >> a_wt;一样。

除此之外,我在头文件中声明了int a_wt;并将此头文件放在两个.cpp文件中。 在编译main.cpp时,我得到了错误&#34; 未初始化的局部变量&#39; a_wt&#39;使用&#34;

如何让main.cpp文件看到它应该是耐心的,它将在第二个.cpp中正确初始化,然后才能在上面的transform行中使用它?我认为头文件将确保两个.cpp文件将&#34;看到&#34;彼此。 (当我在main.cpp中拥有所有代码时,代码通常正在运行。)

非常感谢您的帮助!

ps:关于将大量不重要的代码导出到第二个.cpp文件中;还有其他方法可以将它放在第二个文件的void函数中吗? 一些链接就足够了,因为我自己要学习它而不想花太多时间。

1 个答案:

答案 0 :(得分:0)

有点不清楚你正在尝试做什么,但是考虑在标题中将变量声明为extern int a_wt;,然后在一个.cpp文件中定义它,并确保包括两者中的标题。实施例

// header.h
extern int a_wt;

// file1.cpp
#include "header.h"
int a_wt = 42; // need the definition in one translation unit

// file2.cpp
#include "header.h" 
// file2 has access to a_wt now

如果你想通过更复杂的东西来初始化全局变量,那么你可以将它定义为extern的函数,而不是将其定义为static,并将其用作该函数的结果,如

// header.h
int get_a_wt();

// file1.cpp
#include "header.h"
int get_a_wt() 
{
    static int a_wt;
    // initialize it here
    return a_wt;
}

// file2.cpp
#include "header.h"
// use get_a_wt() instead of a_wt
int something = get_a_wt(); 

但是,尽量减少全局变量的使用,因为它们会使您的代码更难阅读,更少本地化,并且容易产生令人讨厌的副作用。