簡體   English   中英

函數聲明中的最大參數數

[英]Maximum number of parameters in function declaration

我知道函數定義中的最小參數數為零,但是函數定義中的最大參數數是多少? 我問這個問題只是出於知識和好奇心,而不是我要編寫一個真正的函數。

是的,實施存在限制。 以下C ++標准摘錄中的粗體字給出了您的答案。

1. C ++語言


附件B-實施數量

  1. 由於計算機是有限的,因此C ++實現不可避免地會限制它們可以成功處理的程序的大小。 每個實現應在已知的地方記錄這些限制。 本文檔可能會引用存在的固定限制,例如如何根據可用資源來計算可變限制,或者說固定限制不存在或未知。

  2. 限制可能會限制包括以下內容或其他內容的數量。 建議將每個數量后面的方括號內的數字作為該數量的最小值。 但是,這些數量僅是指導原則,並不能確定合規性。
    —復合語句,迭代控制結構和選擇控制結構的嵌套級別[256]。
    —有條件包含的嵌套級別[256]。
    —指針,數組和函數聲明符(任意組合),用於修改聲明中的算術,結構,聯合或不完整類型[256]。
    —完整表達式中帶括號的表達式的嵌套級別[256]。
    —內部標識符或宏名稱[1 024]中的字符數。
    —外部標識符[1 024]中的字符數。
    —一個翻譯單元中的外部標識符[65 536]。
    —在一個塊[1 024]中聲明了塊范圍的標識符。
    —同時在一個翻譯單元中定義的宏標識符[65 536]。
    —一個功能定義中的參數[256]。
    —一個函數調用中的參數[256]。
    —一個宏定義中的參數[256]。
    —一個宏調用中的參數[256]。
    —一條邏輯源代碼行中的字符[65 536]。
    —字符串文字或寬字符串文字中的字符(並置后)[65 536]。
    —對象的大小[262 144]。
    — #include文件的嵌套級別[256]。
    — switch語句的大小寫標簽(不包括任何嵌套switch語句的大小寫標簽)[16 384]。
    —單個類,結構或聯合中的數據成員[16 384]。
    —單個枚舉中的枚舉常量[4 096]。
    —單個struct-declaration-list中的嵌套類,結構或聯合定義的級別[256]。
    —由atexit()[32]注冊的函數。
    —直接和間接基類[16 384]。
    —單個類的直接基類[1024]。
    —成員在一個班級中宣布[4 096]。
    —類中的最終重寫虛擬函數,可訪問或不可訪問[16 384]。
    —類[1 024]的直接和間接虛擬庫。
    —類[1 024]的靜態成員。
    —類別中的朋友聲明[4 096]。
    —類[4 096]中的訪問控制聲明。
    —構造函數定義中的成員初始化程序[6 144]。
    —一個標識符的范圍限定[256]。
    —嵌套的外部規格[1 024]。
    —模板聲明[1 024]中的模板參數。
    —遞歸嵌套的模板實例化[17]。
    —每個try塊的處理程序[256]。
    —將規范投在單個函數聲明[256]上。

此外,它還說$ 18.3 / 6,

實施限制:實施應支持至少32個功能的注冊。

2. C語言


5.2.4.1翻譯限制


該實現應能夠翻譯執行 至少一個程序 ,該程序包含以下每個限制的至少一個實例
— 127個塊的嵌套級別
— 63個條件包含的嵌套級別
— 12個指針,數組和函數聲明符(任意組合),用於修改聲明中的算術,結構,聯合或不完整類型
—在一個完整的聲明符中有63個嵌套的括號聲明符級別
—完整表達式中帶括號的表達式的63個嵌套級別
—內部標識符或宏名稱中的63個有效的初始字符(每個通用字符名稱或擴展源字符均視為單個字符)
—外部標識符中的31個有效初始字符(每個通用字符名稱)
如果指定一個短標識符為0000FFFF或更少,則被認為是6個字符;如果指定一個短標識符為00010000或更大,則每個通用字符名都被認為是10個字符;如果,擴展源字符被認為與相應的通用字符名具有相同的字符數。任何)
—在一個翻譯單元中有4095個外部標識符
—在一個塊中聲明了具有塊范圍的511個標識符
—在一個預處理翻譯單元中同時定義的4095個宏標識符
—在一個函數定義中提供127個參數
—一個函數調用中包含127個參數
—在一個宏定義中有127個參數
—在一個宏調用中有127個參數
—邏輯源代碼行中的4095個字符
—字符串文字或寬字符串文字中的4095個字符(並置后)
—對象中的65535字節(僅在托管環境中)
— #included文件的15個嵌套級別
— switch語句的1023個案例標簽(不包括任何嵌套的switch語句的案例標簽)
—單個結構或聯合中的1023個成員
—單個枚舉中的1023枚舉常量
—在單個struct-declaration-list中包含63個嵌套結構或並集定義的級別

但是,它在注釋中說,

13)實施過程中應盡可能避免施加固定的翻譯限制。

正如先前的回答者已經充分指出的那樣,參數的數量取決於C ++編譯器。 編譯器限制很可能是由於硬件環境施加的限制。

例如, VAX CPU體系結構使用8位字段來保存參數數量,因此兼容的VAX代碼不能傳遞超過255個參數。

同樣,許多小型處理器(如Intel 8048家族)的內存也受到限制,如果使用更多的四個參數,大多數C和C ++編譯器都會感到沮喪。 盡管許多主流開發人員可能會對8048表示嘲笑,但其后代仍然是部署最廣泛的CPU之一-主要在嵌入式設備中。

許多RISC體系結構實現都使用寄存器而不是堆棧來指定參數傳遞方法。 例如,一個基本的ARM CPU只有16個寄存器。 參數的最大數目可能完全取決於編譯器命令行選項,這些選項會影響編譯器生成代碼以傳遞參數的方式。 也許有八個以上被推入堆棧。 也許不吧。

如果這些示例似乎過於嚴格,請考慮Palm OS將C函數限制為單個參數,並且該類型必須為intvoid *

當然,如果您要使用大量參數在C中編寫函數,則可能需要重新考慮程序的設計。

暫無
暫無

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

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