我有两个带有源文件的标头,比方说file1.h
,file1.cc
和file2.h
,file2.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();
}
我遇到了问题,依赖性是相互的,我们不能在不编译另一个文件的情况下编译一个文件。如何解决这个问题?
答案 0 :(得分:1)
#pragma once
)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
)时,很容易潜入不会生成任何警告的此类代码。