簡體   English   中英

C編程:預處理器,包含宏中的文件

[英]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.statelogin.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.

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