簡體   English   中英

C中的函數重載

[英]Function overloading in C

今天,在查看open()的手冊頁時,我注意到此函數“已超載”:

   int open(const char *pathname, int flags);
   int open(const char *pathname, int flags, mode_t mode);

我當時認為C不可能。實現這一目標的“訣竅”是什么?

之后編輯:
因此,這並不是真正的重載,因為使用varargs時-您只能提供相同類型的多個參數。 那么, mode_t在后台是int嗎?

它使用可變參數 這些聲明僅出現在手冊頁中,因為這2是調用open()的唯一方法。 實際的C函數將聲明為例如

int open(const char *pathname,int flags,...);

使用可變參數時,參數不必是同一類型。 printf是一個明顯的例子。

在open()的情況下,如果' flags包含O_CREAT標志,則第一個變量參數必須為mode_t,因為open()的實現期望它為mode_t(在幕后很可能是無符號的int或無符號的long-但是與varargs無關)

C確實可以編寫帶有可變數量的參數的函數 ,例如printf

話雖這么說,C中沒有可靠,跨平台的方法來編寫一個完全接受2或3個參數的函數。 通常,您必須執行類似的操作

some_function(5, 6, 7, NULL);
some_function(5, 6, 8, 2, 5, NULL);

換句話說,您必須有一個終止的“ sentinal”參數。 或者,您可以以某種方式在較早的參數中包括參數數量,例如

another_func(2, "hello", "world");
another_func(3, "goodbye", "cruel", "world");

printf家族采用這種方法。 第一個格式參數包含所需的額外參數的數量; 例如,對於printf("%f %f", 5.6, 7.11)您知道必須有2個float參數。 但是,這在用戶定義的庫函數中會有些不安全,因為如果您說my_printf("%s %f %f %f %s", 5.6)則可能會出現段錯誤或更糟的情況。 幸運的是,大多數C編譯器都會在編譯時檢查您對printf的調用,以避免此類問題。

open的情況下,該函數被聲明為具有可變參數,並且僅在設置O_CREAT檢查第三個參數。 因此,這就是“安全”確定是否存在第三個參數的方式。 我將“安全”用引號引起來,因為從技術上講,沒有辦法讓運行時知道實際傳遞了多少參數。 例如,以下調用將編譯而沒有任何錯誤或警告:

open("foo.txt", 5, "not an integer", 7);    // extra and invalid parameters
open("bar.txt", O_CREAT);                   // third parameter is missing

“當標志中包含O_CREAT時,必須指定模式,否則將被忽略。”

extern int open (__const char *__file, int __oflag, ...)

它使用varargs並且僅在__oflag包含O_CREAT時才加載模式變量參數。

很簡短的答案-varargs

您可以使用帶有...變量參數列表來偽造它

int function(int x, ...);

暫無
暫無

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

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