[英]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.