[英]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
,當然也不能是2
或3
)。
編輯-下面的文本在user694733的評論之后添加
按照您給出的三個示例,這足以滿足格式字符串的要求。 但是,正如user694733在評論中指出的,這不是全部。
一般而言,格式說明符遵循原型%[flags][width][.precision][length]specifier
。 上面的方法是起點,並且將用於格式字符串工作已經沒有flags
,可能的*
在width
說明符,沒有*
的precision
說明符,俯瞰length
和specifier
字段。 對於一般格式的字符串,需要考慮所有這些因素,並相應地分析該字符串。 要做的工作取決於您需要的計數穩健性-例如,如果需要檢測無效的格式字符串,則需要做更多的工作。
我不確定您為什么需要這樣做 ,但是您的問題可能會以這種方式解決(此問題的答案: 可變參數宏技巧 )。
如注釋中所建議,您可以將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.