两个文件互为使用功能-如何解决?

时间:2018-10-31 20:08:06

标签: c++ header include linkage

我有两个带有源文件的标头,比方说file1.hfile1.ccfile2.hfile2.cc。它们互相使用其他功能,例如:

file1.h:

void test1();

file2.h:

void test2();

file1.cc:

#include "file1.h"
#include "file2.h"

void test1() {
  do_something();
  test2();
}

file2.cc:

#include "file1.h"
#include "file2.h"

void test2() {
  do_something_else();
  test1();
}

我遇到了问题,依赖性是相互的,我们不能在不编译另一个文件的情况下编译一个文件。如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

  1. 修改文件以删除双重递归。
  2. 使用一些代码来防止重复包含.h文件(我在.h文件的顶部使用了#pragma once
  3. (可选)添加main.cpp来调用函数
  4. 为do_something()提供代码
  5. 使用编译。 g++ *.cpp -o main

好问题!

以下是文件:

// main.cpp
//

#include <iostream>

#include "file1.h"
#include "file2.h"

int main() {

    test2();
    std::cout << "Hello, World!" << std::endl;
    return 0;
}

// file1.cpp

#include "file1.h"
#include "file2.h"
#include <iostream>

void do_something() {
    std::cout << "Just hit do_something" << std::endl;
}
void test1() {
    do_something();
//    test2();  // Do not use double recursion.
}

// file1.h

#pragma once

void do_something();
void test1();

// file2.cpp

#include "file1.h"
#include "file2.h"

void test2() {
    do_something();
    test1();
}

// file2.h

#pragma once

void test2();

答案 1 :(得分:-2)

最好的答案是不要那样设计代码!。这引入了“ circular dependency”,这立即使您的代码易碎。另外,您编写示例的方式描述了一个双递归函数(A调用B,A调用A),并且由于没有终止条件,因此是无界的!如您所见,这可能会导致一些非常难以控制的情况。

让我们放弃一段时间的良好工程实践。您如何描述标头和源文件就足够了,可以使用以下命令进行构建:

time.restart()

这使事情变得困难:仅通过构建指令,您实际上无法检测到依赖性!好的静态代码检查器可以检测到这些情况并向您发出警告,但是当您使用惰性编译器(例如不带标志的g++ file1.cc file2.cc -o libCoupledRecursiveExample.so)时,很容易潜入不会生成任何警告的此类代码。