簡體   English   中英

確定printf參數的數量

[英]Determine number of printf arguments

在給定printf格式字符串的情況下,是否有標准的C / C ++函數返回期望的參數數量? 例如:

num_printf_args("%d %s") == 2;
num_printf_args("%.1f%%") == 1;
num_printf_args("%*d") == 2;

僅計算格式字符串中的%數將是一個第一近似值,這在第一個示例中有效,但顯然在第二個和第三個示例中無效。

我知道gcc可以做到這一點,因為在編譯時它會抱怨實際傳遞給printf的參數數量(以及它們的類型)與格式字符串不匹配。

沒有標准功能可以執行此操作。

但是,這很容易實現。

張數%未再接再% 計數的每個%的加1立即緊跟一個*

計算%字符的游程時,不允許重疊。 因此,“ %%% d”的結果應為1 (而不是0 ,當然也不能是23 )。

編輯-下面的文本在user694733的評論之后添加

按照您給出的三個示例,這足以滿足格式字符串的要求。 但是,正如user694733在評論中指出的,這不是全部。

一般而言,格式說明符遵循原型%[flags][width][.precision][length]specifier 上面的方法是起點,並且將用於格式字符串工作已經沒有flags ,可能的*width說明符,沒有*precision說明符,俯瞰lengthspecifier字段。 對於一般格式的字符串,需要考慮所有這些因素,並相應地分析該字符串。 要做的工作取決於您需要的計數穩健性-例如,如果需要檢測無效的格式字符串,則需要做更多的工作。

我不確定您為什么需要這樣做 ,但是您的問題可能會以這種方式解決(此問題的答案: 可變參數宏技巧 )。

如注釋中所建議,您可以將printf的調用包裝到一個宏中,該宏將首先計算所需參數的數量,然后繼續執行您想做的任何事情。

博客文章中的代碼:

#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL(__VA_ARGS__, 5,4,3,2,1)
#define VA_NUM_ARGS_IMPL(_1,_2,_3,_4,_5,N,...) N

// to verify, run the preprocessor alone (g++ -E):
VA_NUM_ARGS(x,y,z)

暫無
暫無

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

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