两个文件使用彼此的功能-如何解决

Two files using each other funtions - how to solve it?

本文关键字:功能 何解决 解决 两个 文件      更新时间:2023-10-16

我有两个带有源文件的头,比如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();
}

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

  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();

最好的答案是不要这样设计代码这引入了一个"循环依赖",它会立即使代码变得脆弱。此外,您编写示例的方式描述了一个双递归函数(a调用B,B调用a(,并且由于没有终止条件,因此它是无界的!正如你所看到的,这可能会导致一些非常难以控制的情况。

让我们暂时放弃良好的工程实践。你是如何描述这两个标题的&源文件是足够的,可以用以下命令构建:

g++ file1.cc file2.cc -o libCoupledRecursiveExample.so

这就是事情变得困难的地方:仅通过构建指令,您实际上无法检测依赖关系!好的静态代码检查器可以检测到这些情况并向您发出警告,但当您使用懒惰的编译器(如没有标志的g++(时,很容易通过这样不会生成任何警告的代码进行窥探。