0

我想制作一个程序,其中除了主目录之外还包括子目录中的源文件和头文件。子目录的名称和部分文件名本身需要使用编译器常量来选择。这是一个示例文件树。

=main.h
=main.c
=anotherfile.h
=anotherfile.c
=A
---= A_file1.h
---= A_file1.c
---= A_file2.h
=B
---= B_file1.h
---= B_file1.c
---= B_file2.h

每个编译都涉及 main 和 anotherfile,它们引用 X_file1 和 X_file2,其中“X”在构建时选择或使用常量。所以项目既可以用 A 文件构建,也可以用 B 文件构建。

那么如何(以及“最佳”方法)如何实现这一点?可以在#include 语句中引用编译器常量吗?(类似于#include X+"/"+"x+"_file1.h)或者还有其他方法吗?

我对 C 构建系统和预处理器非常陌生,如果这是一个糟糕的问题,我深表歉意。搜索引擎并没有太大帮助。

4

1 回答 1

0

如何实现这一点?

无论哪种方式,我都会跑到构建系统。配置构建系统以使用指向文件的不同宏定义多次编译文件。一个粗略的例子:

// main.c
#include IMPL

然后例如使用 CMake 构建系统:

add_executable(file1 main.c file1.c)
target_compile_definitoins(file1 PUBLIC "IMPL=\"file1.h\"")   
add_executable(file2 main.c file2.c)
target_compile_definitions(file1 PUBLIC "IMPL=\"file2.h\"")
# etc..

总的来说,这种方法似乎是错误的和令人困惑的。强烈考虑重写您的应用程序,以便所有文件可以一起编译,并且所有符号都是唯一的 - 这将简化编写并帮助 IDE 跳转到正确的函数定义,并减少您的头疼。

如果您在为同一个接口提供多个实现而苦苦挣扎,那么有一个解决方案 - 用函数指针实现一个接口对象。然后,使用构造函数或使用虚拟接口构造对象的工厂选择适当的实现。

于 2021-12-25T23:08:41.243 回答