【问题标题】:Function parameters max number功能参数最大数量
【发布时间】:2012-02-20 12:43:42
【问题描述】:

我没有发现 C99 标准中对 count 函数参数有任何限制,我猜它只受堆栈大小的限制。

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

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

我知道这么多的参数不太可能,但我想知道编译器的哪个参数决定了这个限制?

编辑

生成 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

【问题讨论】:

  • 愿意分享导致此问题的代码吗?
  • @Martinsh Shaiters 我写了一些 sh ​​脚本来生成源代码。查看更新

标签: c parameter-passing stack-overflow


【解决方案1】:

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

5.2.4.1 翻译限制

— 一个函数定义中有 127 个参数
— 一个函数调用中有 127 个参数

【讨论】:

  • 有趣。这不是很多!我也会认为“无限,取决于内存大小”。
  • 这些是实现可能施加的可接受的最低限度。对这样的事情有更大的限制或根本没有明确的限制当然是允许的(也是可取的)。
  • 源代码行的最大长度也有限制,1K 左右,或者 4K 左右。测试程序也可能会达到这个限制。 (先到先得……)
  • 更不用说必须阅读您的代码的人施加的最大可接受限制,超过此限制可能会导致这些人出现未定义的行为。所以不要拉伸它:)
  • @wildplasser “源代码行”是指以 CR/LF 结尾的行,还是以分号结尾的行?第一个是很容易避免的限制。后一个限制将更难避免。
猜你喜欢
  • 1970-01-01
  • 2011-05-10
  • 2012-02-02
  • 2019-08-04
  • 2021-02-13
  • 1970-01-01
  • 2019-03-17
  • 2013-10-30
  • 1970-01-01
相关资源
最近更新 更多