簡體   English   中英

使用基於編譯器常量的子目錄編譯 C

[英]Compile C with subdirectory based on compiler constant

我想制作一個程序,除了主目錄外,還包括子目錄中的源文件和頭文件。 子目錄的名稱和部分文件名本身需要使用編譯器常量來選擇。 這是一個示例文件樹。

=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 構建系統和預處理器很陌生,如果這是一個糟糕的問題,我深表歉意。 搜索引擎並沒有太大幫助。

如何實現這一點?

無論哪種方式,我都會運行到構建系統。 將構建系統配置為使用指向文件的不同宏定義多次編譯文件。 一個粗略的例子:

// 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 跳轉到正確的函數定義,並減少您的頭疼。

如果您正在努力為同一個接口提供多個實現,那么有一個解決方案 - 使用函數指針實現接口對象。 然后,使用構造函數或使用虛擬接口構造對象的工廠選擇正確的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM