2013-06-28 38 views
1

在C語言中,當調用的函數沒有原型時,編譯器執行默認參數升級默認參數促銷何時發生?

但是C++怎麼樣?默認參數促銷何時會發生?

在C++ 11標準5.2.2/7:

當存在對於給定的參數沒有參數,該參數是 以這樣的方式使得接收功能能夠獲得值傳遞 通過調用va_arg(18.10)的論點。 [注意:此段 不適用於傳遞給函數參數包的參數。 函數參數包在模板實例化 (14.5.3)期間展開,因此實際調用功能模板專用化時,每個此類參數都有相應的參數。結束符 參數表達式執行了左值到右值(4.1),數組到指針(4.2)和 函數到指針(4.3)的標準轉換。具有(可能是cv合格)類型 std :: nullptr_t的參數被轉換爲void *(4.10)類型。在這些 轉換之後,如果參數沒有算術,枚舉,指針,成員指針或類類型,則該程序是格式不正確的。 傳遞具有非平凡複製構造函數,非平凡移動構造函數, 或非平凡析構函數,並且沒有相應參數的類類型(第9章) 的潛在評估參數是 有條件地支持實現定義語義。如果參數 的整數或枚舉類型受 積分促銷(4.5)或浮點類型( )影響的浮點促銷(4.6),則參數的值爲 轉換爲促銷在通話之前鍵入。這些促銷活動是 ,被稱爲默認參數促銷活動。

該段落仍未指定默認參數提升何時發生。沒有明確的邏輯,這一段可能會說得太多。我努力概述邏輯但失敗了。我不熟悉調用va_arg的

希望你能幫助我。

回答

1

在調用上下文之前調用函數之前會發生默認促銷。

如果你確實在問在什麼情況下進行默認促銷活動,這在摘錄中已有介紹,儘管它很小,很容易錯過:「當給定參數沒有參數時。 ..「。換句話說,它與C中的情況基本相同,不同之處在於C++中不存在C型函數聲明,它沒有指定參數類型。因此,只有當函數具有明確的省略號時,如果沒有指定其類型的參數,唯一的一次參數是printfint printf(char const *format, ...);

1

從您在您的問題中引用的段落:「在調用之前將參數的值轉換爲促銷類型」

你說的C「默認參數提升,當被調用的函數沒有原型時」 - 但記住C++中不存在場景 - 你不能調用沒有看到聲明或定義的函數。

提及「調用va_arg」意味着在調用函數時會應用某些參數促銷,該函數將使用va_arg函數(請參閱http://linux.die.net/man/3/va_arg)訪問這些值。可以這樣想:一個函數調用可能會傳遞值int(3),另一個int(7777),又一個char(7) - 被調用的函數應該如何知道該期待什麼?它可能會推動該參數的所有值給部分最大支持的綜合型,如intlong,那麼當va_arg是在函數中使用它會轉換從intlong到任何整數類型va_arg調用指定。例如,這確實意味着int(7777)值可能只在預期的char處傳遞,並且該值可能會在沒有警告的情況下被截斷爲8位,但這通常比程序崩潰更好,因爲傳遞的數據字節數沒有「不匹配所消耗的數量,或其他一些奇怪的副作用。