[英]Print statically allocated array contents at compile time
在 C 中,如果包含各種數組元素由#define
值確定,是否可以打印(在編譯時)靜態定義數組的內容?
我看到了很多關於#pragma message
的問題(似乎很有幫助),但沒有看到關於如何做我想做的事情的問題(盡管我可能正在尋找錯誤的東西)。
這是我想要完成的事情:
我正在使用一個大型的第 3 方開源庫,該庫(除其他外)包含大量信息,其中數組的內容永遠不會改變,並且數組的長度取決於是否(噸和噸)定義了預處理器符號。 我需要能夠在編譯時打印數組包含的內容。
這是一個非常小的程序,可以顯示我所了解的要點:
#include "stdlib.h"
#include "stdio.h"
// there are tons of these, some of which are conditionally defined based on tons of other defines.
// All are defined in other header files and none are defined via the command line, i.e. via `-DTHREE`.
#define ONE
#define TWO
// ...
int main()
{
int values[] = {
#ifdef ONE
1,
#endif
#ifdef TWO
2,
#endif
#ifdef THREE
3,
#endif
#ifdef FOUR
4,
#endif
#ifdef FIVE
5,
#endif
0
};
int i = 0;
for (i = 0; values[i] != 0; i++)
{
printf("values[%d] = %d\n", i, values[i]);
}
return 0;
}
顯然,如果我編譯這段代碼(使用gcc
)並運行它,那么我會得到 output:
values[0] = 1
values[1] = 3
但是,我想知道的是值 1 和 3在 compile time存在於數組中。 需要明確的是,我不在乎數組中是否存在任何特定值; 我只想知道數組中的實際內容,而不必運行二進制文件。 理想情況下,我的工作流程是編譯代碼並在 output 中搜索特殊格式的消息,這些消息會告訴我數組包含什么。 代碼應該始終編譯,因為我的意圖是添加的診斷程序會告訴我二進制文件是否阻止它編譯是否包含某些內容。
我試圖做以下事情:
#pragma message
。 所以像: // ...
#ifdef ONE
#pragma message "1 is included"
1,
#endif
// ...
這會導致編譯錯誤( error: expected expression before '#pragma'
)
#warning
。 所以像: // ...
#ifdef ONE
#warning "1 is included"
1,
#endif
// ...
這很好用,但只要我使用-Werror
(我需要這樣做)編譯就會失敗。
關於如何實現這一點的任何想法都會很棒。
更新/澄清:在我的簡單示例中,每個元素包含的#ifdef
保護只是檢查一個符號。 這不反映實際代碼; 實際代碼的預處理器守衛檢查許多、許多、許多符號以確定是否應包含單個數組元素。 因此,我檢查符號列表以確定列表中的內容是不切實際的,因為我實際上必須復制復雜的預處理器符號檢查。
message pragma 的一個典型用途是在編譯時顯示信息性消息。 但是您在編譯指示按摩中忘記了(
)
..... 只需像這樣使用#pragma message("1 is included")
了解更多信息,請參閱vc++ message pragma
我不得不“讓一些東西工作”,所以我最終做了以下事情:
我編寫了一個 python 腳本,該腳本將解析包含帶有#if defined(...)
邏輯的巨型數組的文件,並生成一個結構相同的#ifdef
代碼塊,而不是定義數組元素,而是使用#pragma message
到 output有關包含在數組中的元素的信息。
然后將生成的預處理器日志記錄添加到數組定義上方的相關源文件中,並附有非常明顯的注釋,說明它是什么以及在數組定義發生變化時如何重新生成它。
理想情況下,我會將 python 腳本集成到我的構建系統中,以便自動重新生成日志記錄代碼,使其永遠不會與數組定義不同步。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.