2014-09-30 2 views
8

Ich weiß, dass ich niemals solch eine Grenze erreichen würde, wenn ich guten Praktiken folge. Allerdings muss ich eine automatisch generierte Funktion mit Losen von Parametern verwenden (und ich kann nichts damit ändern, ich empfange die Funktion von jemand anderem).Gibt es eine maximale Anzahl von Parametern für Funktionen in C mit dem gcc (bzw. MinGW) Compiler?

Also: Wie viele Parameter kann ich maximal in gcc verwenden? MinGW?

Ich habe this über die C++ - Sprachspezifikation gefunden. Und this über die C-Standard-Grenzwerte. Was mich interessiert, ist die Frage, was die Grenzen der "realen Welt" sind/Einzelheiten der Implementierung. Vor allem in gcc und MinGW.

Auch: Welche Art von Fehlermeldung könnte ich erwarten, wenn ein solches Limit erreicht wird? Und macht die Verwendung des C-Codes in einer C++ - Anwendung über die extern "C" Deklaration für das "normale" C-Limit einen Unterschied? Es können hier andere Grenzen als die Anzahl von Parametern gelten, z. etwas wie eine maximale Zeilenlänge? Oder die maximale Stapelgröße?

Danke!

+0

wie ich weiß (und Ihr erster Link sagt) das Limit ist 256 Argumente in C++ und 127 in c. Die Zeilenlänge ist kein Problem, da Sie eine Zeile in mehrere Zeilen aufteilen können. Die Stapelgröße wird nur ein Problem sein, wenn Sie riesige Strukturen als Argumente (nicht Zeiger auf die Strukturen) haben. – mch

+0

Das ist, was der Standard als "minimale" Zahlen angibt (Ich habe die entsprechenden Beiträge in meiner Frage verknüpft). Was ich gerne wissen möchte, ist die "echte" Zahl, die Einschränkungen eines bestimmten Compilers. Zeilenlänge: Ich bin mir nicht sicher, aber ich dachte, der Präprozessor entfernt sowieso irgendwelche Zeilenumbrüche usw. (der Grund, warum wir das ";" am Ende jeder Zeile brauchen) - also bricht man sie in mehrere Zeilen (was ich habe Natürlich macht es keinen Unterschied, denke ich. Stackgröße: Ok, ich muss nur Zeiger übergeben, also scheint das keine Einschränkung zu sein. – mozzbozz

+2

Es ist wahrscheinlich ABI, Prozessor und Compiler spezifisch. Ich nehme an, dass du ein x86-64 hast.Dann * in der Praxis * ist das Limit auf Stack-Frame und Stack-Größe bezogen, also denke ich, du könntest ein paar tausend Argumente übergeben. Und ich schlage vor, dass Sie einen einfachen Test machen: Schreiben Sie ein Skript, das für ein Argument N eine Funktion von N Argumenten in einer Datei erzeugt (z. B. die Summe aller Argumente berechnet), und in einer anderen Datei ein 'main' ruft . –

Antwort

1

In C gibt es spezielle Librarys (stdarg.h) für mehrere Parameter. Mit dieser Bibliothek können Sie Funktionen wie folgt schreiben:

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

Und ich glaube nicht, dass es eine bestimmte Grenze.


Hier ist ein Beispiel dafür, wie diese Bibliothek verwenden: (Credits: 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

Standard wissen nicht, aber über dem Stapel, können Sie eine beliebige Anzahl von Parametern übergeben, wenn Pass-Through-Register, die Menge begrenzt durch die Anzahl der Register. In der Sprache c können Sie Strukturen nach Wert über Stapel übergeben.

+7

c standard 5.2. 4.1 sagt: '127 Parameter in einer Funktionsdefinition' ' 127 Argumente in einem Funktionsaufruf' – mch

10

der C Standard 5.2.4.1 sagt:

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

auch die Stack-Größe (1MB - 8MB) ist eine Grenze, wenn Sie große Strukturen als Argumente haben.

Aber all diese Grenzen sind weit weg von allem, was gute Praxis ist.

https://gcc.gnu.org/onlinedocs/gcc-4.3.5/cpp/Implementation-limits.html sagt, dass GCC hat viel höhere Grenzen (begrenzt nur durch den verfügbaren Speicher).

+3

Beachten Sie, dass das 'gcc' Dokument, das Sie erwähnen, nur den c-Präprozessor abdeckt und während Indikativ diesen Fall nicht wirklich abdeckt. –

+0

Es gibt Mikrocontroller mit Stack einer Stapelgröße von 256 Bytes oder weniger. – 12431234123412341234123

Verwandte Themen