簡體   English   中英

當您不想傳遞任何變量時,是否可以在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.

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