[英]C Programming: Preprocessor, include files from macro
如果我可以找到一種類似的方法,那么我可以在應用程序中減少數百行代碼,並大大提高可維護性。 有人有想法么?
#include <stdio.h>
int main( )
{
#define include_all_files(root) \
#include #root "1.h" \
#include #root "2.h" \
#include #root "3.h" \
#include #root "4.h"
include_all_files( first_library )
include_all_files( second_library )
include_all_files( third_library )
return 0;
}
編輯 :
我感謝您的回答,我的示例似乎造成了錯誤的方向,所以這是我實際上要解決的問題:
我正在實現一個有限狀態機。 通過命名約定,添加狀態變得如此簡單:
STATE(initial_screen)
#include "initial_screen.state"
END_STATE
STATE(login)
#include "login.state"
END_STATE
但是,如果我可以回答原始問題,則可以將其重構為以下簡單內容:
ADD_STATE(initial_screen)
ADD_STATE(login)
這是因為文件名和狀態名,以及所有底層連接以及其他所有內容都遵循相似的約定。 但是,我無法弄清楚如何基於宏中接收的令牌來實現包含文件。
為什么不創建一個頭文件本身#include
一切都會庫中的其他頭文件的? 然后,對於每個庫,您只需添加該庫的一個元標題即可。
不幸的是,這超出了C預處理器的功能。
您是否考慮過使用m4之類的東西?
為了解決您所澄清的問題,您只需重構initial_screen.state
和login.state
使它們以STATE()
開頭並以END_STATE
結束。 然后,您可以執行以下操作:
#include "initial_screen.state"
#include "login.state"
...相當於您所需要的-它只是#include
而不是ADD_STATE
。
在文件include.h中
#include "1.h"
#include "2.h"
#include "3.h"
在所有其他文件中
#include "includes.h"
#include預處理指令本身在與宏評估相同的步驟中處理,因此可能無法正常工作。 我不認為預處理可以是遞歸的。 (或對此進行迭代)。
取而代之的是,完成此操作的典型方法是創建一個包含所有所需的#includes的小型包含文件。 請參閱Cory Petosky的回復以獲取插圖。
請注意 :
盡管這可能會減少數百行代碼,但是您應該考慮這些是“簡單”的代碼行 。 與程序的真實邏輯相關聯的代碼行不同,通常會跳過它們。
此外,顯式列出給定文件所需的個人包括的內容可提供一些自我文檔,並在需要時使重構代碼更加容易。
編輯 :這只是在;-)
有人剛剛問了這個問題,將所有項目標頭放入一個文件中是個好主意嗎? ,而且回應似乎大致上與我的看法一致,即分組標頭通常沒有什么好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.