功能参数最大数量

tri*_*san 10 c stack-overflow parameter-passing

我没有发现C99标准中计数函数参数的任何限制,我想它只受堆栈大小的限制.

但是,我编写了一个简单的测试程序来演示具有大量参数的函数的行为.当它大约10k时,我在gcc上遇到以下错误(gg版本4.5.3在Cygwin上):

/usr/lib/gcc/i686-pc-cygwin/4.5.3/../../../libcygwin.a(libcmain.o):(.text+0xa9): undefined reference to `_WinMain@16'
Run Code Online (Sandbox Code Playgroud)

我意识到如此大量的参数不太可能,但我想知道编译器的哪个参数决定了这个限制?

编辑

脚本生成C源代码

#!/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
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 15

标准规定了每个实施必须支持的特定最小数量,

5.2.4.1翻译限制

- 一个函数定义中的
127个参数 - 一个函数调用中的127个参数

  • 更不用说必须阅读您的代码的人施加了*最大可接受限制*,超过此限制可能会导致这些人的未定义行为.所以不要拉伸它:) (14认同)
  • 这些是*实施可能施加的*最小可接受限度.在这样的事情上,对于具有更大的限制或没有明确的限制当然是允许的(并且是可取的). (2认同)
  • 源线的最大长度,1K左右或4K左右的最大长度也有限制。测试程序也可能会达到此限制。(无论先发生什么……) (2认同)