2014-09-30 73 views
8

我知道在遵循最佳實踐時我絕不會達到這樣的限制。然而,我需要使用一個自動生成的函數批次的參數(我不能改變任何東西,我從其他人那裏收到函數)。使用gcc(或MinGW)編譯器有C函數的最大參數數量嗎?

所以:我可以在gcc resp中使用的最大參數數量是多少。 MinGW的?

我發現this關於C++語言規範。和關於C語言標準限制的this。我感興趣的是「真實世界」限制/實施細節是什麼。特別是在gcc和MinGW中。

此外:當達到這樣的限制時,我可以期待什麼樣的錯誤信息?當通過extern "C"聲明在C++應用程序中使用C代碼時,這對「正常」C限制有什麼影響嗎?可能在這裏適用的參數數量以外的限制,例如,像最大線長?或者最大堆棧大小?

謝謝!

+0

據我所知(和你的第一個鏈接說)的限制是C++中的256個參數和c中的127個。行長度沒有問題,因爲您可以將行分成更多行。如果你有巨大的結構作爲參數(不是指向結構體的指針),堆棧大小將只是一個問題。 – mch 2014-09-30 13:37:56

+0

這就是標準規定的「最小」數字(我在我的問題中鏈接了相應的帖子)。我想知道的是「真實」數字,即特定編譯器的侷限性。線條長度:我不確定,但我認爲,預處理器無論如何都會刪除任何換行符(爲什麼我們需要每行結尾處的「;」) - 因此將它們分成多行(我已經我認爲,當然完成)並沒有什麼不同。堆棧大小:好吧,我只需要傳遞指針,這似乎不是一個限制。 – mozzbozz 2014-09-30 14:02:39

+2

它可能是ABI,處理器和編譯器特定的。我想你有一個x86-64。然後*在實踐中*限制與堆棧幀和堆棧大小有關,所以我猜你可能會傳遞幾千個參數。我建議你做一個簡單的測試:編寫一個腳本,爲一些參數N生成一個文件中包含N個參數的函數(例如計算其所有參數的總和),並在另一個文件中調用一個main函數。 – 2014-09-30 14:06:37

回答

1

在C中有多個參數的特殊庫(stdarg.h)。 有了這個庫,你可以寫函數是這樣的:

int a_function (int x, ...) 
{ 
    va_list a_list; 
    va_start(a_list, x); 
} 

而且我不覺得有什麼特別的限制。


下面是一個例子,如何使用這個庫: (貸:http://www.cprogramming.com/tutorial/c/lesson17.html

#include <stdarg.h> 
#include <stdio.h> 

/* this function will take the number of values to average 
    followed by all of the numbers to average */ 
double average (int num, ...) 
{ 
    va_list arguments;      
    double sum = 0; 

    /* Initializing arguments to store all values after num */ 
    va_start (arguments, num);   
    /* Sum all the inputs; we still rely on the function caller to tell us how 
    * many there are */ 
    for (int x = 0; x < num; x++)   
    { 
     sum += va_arg (arguments, double); 
    } 
    va_end (arguments);     // Cleans up the list 

    return sum/num;      
} 

int main() 
{ 
    /* this computes the average of 13.2, 22.3 and 4.5 (3 indicates the number of values to average) */ 
    printf("%f\n", average (3, 12.2, 22.3, 4.5)); 
    /* here it computes the average of the 5 values 3.3, 2.2, 1.1, 5.5 and 3.3 
    printf("%f\n", average (5, 3.3, 2.2, 1.1, 5.5, 3.3)); 
} 
-3

標準不知道,但在堆棧中,你可以傳遞任何數量的參數,如果通過寄存器,數量受限於寄存器的數量。在c語言中,您可以通過堆棧的值傳遞結構。

+7

c標準5.2。 4.1說:'127個參數在一個函數定義中' '127個參數在一個函數調用中' – mch 2014-09-30 13:55:41

10

C標準5.2.4.1說:

4095 characters in a logical source line 
127 parameters in one function definition 
127 arguments in one function call 

也堆棧大小(1MB - 8MB)是有極限的,如果你有巨大的結構作爲參數。

但是,所有這些限制都遠離一切良好的做法。

https://gcc.gnu.org/onlinedocs/gcc-4.3.5/cpp/Implementation-limits.html說gcc有更高的限制(只限於可用內存)。

+3

請注意您提到的'gcc'文件只涵蓋了c-preprocessor,而指示符並不真正涵蓋這種情況。 – 2014-09-30 14:16:39

+0

有一些堆棧大小爲256字節或更小的微控制器。 – 12431234123412341234123 2017-08-24 13:37:24