[英]Can you pass a function with a variable amount of arguments as an argument to another function in C?
[英]Can you have in C variable length arguments functions with cases when you don't want to pass any variable?
我想用可變長度參數在C中創建一個函數,在該函數中我可能不希望在任何時候傳遞任何變量。 我在C中有這樣的可能嗎? 如果可能的話,我想要一些代碼片段。 另外,我不得不提到的是,當傳遞一些變量時,該函數將僅傳遞char *變量。
標准C不支持此功能。
對於以省略號結尾的功能參數類型列表,必須至少有一個命名參數。
對於使用標識符列表定義的函數,調用中的參數數量必須與定義中的參數數量匹配; 不支持不同數量的參數。
如果要使用不同數量的char *
參數調用一個函數,並且該數字可能為零,則可以使用始終傳遞但從未使用過的虛擬第一個參數聲明該函數,例如:
void foo(int dummy,...);
請注意,不傳遞任何參數是一個麻煩的設計。 通常,接受不同數量參數的例程從一個或多個參數推斷參數的數量。 例如,第一個參數可能包含剩余參數的數量,或者它可能是一個格式字符串(與printf
),可以從中推斷出剩余參數的數量和類型。 如果您希望函數在某些情況下接受零參數,則它必須有一種方法來知道它是否被零參數或更多參數調用。 這將需要處於某種全局狀態的信息,這通常是一個糟糕的設計。
不,你不能
您至少需要一個已知的論點
void foo(int dummy, ...)
{
va_list ap;
具有可變參數的函數必須至少具有一個names參數才能讀取其他參數。
對於您的特殊情況,由於要傳遞char *
參數列表,因此可以使用NULL表示參數列表的末尾。 因此,在沒有任何要傳遞的情況下,您只需傳遞一個單NULL參數。
C沒有提供任何機制允許被調用函數確定提供了多少個參數。 該機制必須是調用接口的一部分。
例如, printf
依賴於%
格式規范,而execv
要求調用者放置一個空指針作為最后一個參數。
可以在不使用變量參數的情況下調用varargs函數,但是在這種情況下,調用方不得嘗試訪問任何變量參數。 例如,僅在創建新文件的情況下才查詢Posix open()函數的mode
參數,因此,如果flags
參數不包含O_CREAT
標志(或其他一些擴展標志,例如Linux中的O_TMPFILE
,它要求創建文件)。
原型的可變長度部分必須遵循至少一個固定參數。 因此,根本不可能不帶任何參數地調用varargs函數。
當您不想傳遞任何變量時,是否可以在C變量長度自變量函數中使用帶格的情況?
是。 在現代C語言中,Code無法定義不帶參數的...
函數,但是您可以通過聲明不帶函數簽名的函數來調用不帶參數的函數。 這樣,可以使用零參數調用該函數。
該函數仍然需要某種方式來理解參數的計數。 通常使用第一個參數作為count(或format )或最后一個參數作為前哨來完成。
鑒於“只會通過char*
” ...
int foo_count(int counter, ...);
// zero usage example
foo_count(0);
int foo_sentinel(char *s);
// zero usage example
foo_sentinel((char*) NULL);
要在不傳遞任何參數的情況下執行此操作,則需要以其他方式(可能不使用全局變量)來傳遞計數-盡管不建議這樣做。 (最好只是通過計數。)
聲明功能:
int foo_count;
int foo(); // no prototype
通話功能
foo_count = 0; foo()
foo_count = 1; foo("one")
foo_count = 2; foo("one", "two")
定義功能
int foo(char *s1, ...) {
if (foo_count > 0) {
va_list ap;
va_start(ap, s1);
puts(s1);
for (int i=1; i < foo_count; i++) {
puts(va_arg(ap, char *));
}
va_end(ap);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.