2012-01-27 22 views
9

Nie znalazłem żadnych ograniczeń parametrów funkcji licznika w standardzie C99 i wydaje mi się, że jest to ograniczone tylko przez rozmiar stosu.Parametry funkcji maksymalna liczba

Jednak napisałem prosty program testowy, aby zademonstrować zachowanie funkcji z dużą liczbą parametrów. Kiedy jej o 10k, pojawia się następujący błąd na gcc (gcc w wersji 4.5.3 na Cygwin):

/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `[email protected]' 

Zdaję sobie sprawę, że tak duża liczba parametrów jest mało prawdopodobne, ale zastanawiam się, co parametr kompilatora określa ten limit ?

EDIT

skrypt do generowania C-source

#!/bin/sh 

num=$1 

echo "" > out.c 
echo "#include <stdio.h>" >> out.c 

echo "int getsum(" >> out.c 

i=0 
while [ $i -lt $num ] 
do 
    ((i++)) 
    if [ $i -eq $num ] 
    then 
     echo "int p$i)" >> out.c 
    else 
     echo -ne "int p$i," >> out.c 
    fi 
done 

echo "{" >> out.c 

echo -ne " return " >> out.c 

i=0 
while [ $i -lt $num ] 
do 
    ((i++)) 
     if [ $i -eq $num ] 
     then 
       echo "p$i;" >> out.c 
     else 
       echo -ne "p$i + " >> out.c 
     fi 
done 

echo "}" >> out.c 

echo "int main(){" >> out.c 
echo "printf(\"Sum of %d elements is %d\", $num, getsum(" >> out.c 

i=0 
while [ $i -lt $num ] 
do 
     ((i++)) 
     if [ $i -eq $num ] 
     then 
       echo "$i" >> out.c 
     else 
       echo -ne "$i," >> out.c 
     fi 
done 

echo "));" >> out.c 

echo "return 0;}" >> out.c 
gcc out.c 
./a.exe 
+0

Opieki dzielić kod powodujący, że jest? –

+0

@Martinsh Shaiters napisałem skrypt sh do generowania źródeł. Zobacz aktualizację – triclosan

Odpowiedz

13

Standard określa pewną minimalną liczbę, która musi obsługiwać każde wdrożenie,

5.2.4.1 Translation Granice

- 127 parametrów w jednej definicji funkcji
- 127 argumentów w jednym wywołaniu funkcji

+0

Interesujące. To nie jest dużo! Myślałbym "nieograniczony, w zależności od wielkości pamięci". –

+1

Są to * minimalne akceptowalne limity * może nałożyć implementacja. Z pewnością jest dopuszczalne (i pożądane) posiadanie większego limitu lub żadnego wyraźnego limitu w ogóle na takie rzeczy. –

+1

Istnieje również ograniczenie maksymalnej długości linii źródłowej, 1K-czegoś lub 4K-czegoś. Program testowy prawdopodobnie również osiągnie ten limit. (cokolwiek przychodzi pierwsze ...) – wildplasser

Powiązane problemy