Câu hỏi Số tham số hàm số


Tôi không tìm thấy bất kỳ giới hạn của các thông số chức năng đếm trong tiêu chuẩn C99 và tôi đoán nó chỉ bị giới hạn bởi kích thước ngăn xếp.

Tuy nhiên tôi đã viết một chương trình thử nghiệm đơn giản để chứng minh hành vi của một hàm với một số lượng lớn các tham số. Khi khoảng 10k của nó, tôi nhận được lỗi sau trên gcc (gcc phiên bản 4.5.3 trên Cygwin):

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

Tôi nhận ra rằng số lượng lớn các thông số là không thể nhưng tôi tự hỏi những gì tham số của trình biên dịch xác định giới hạn này?

CHỈNH SỬA

kịch bản để tạo nguồn 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

9
2018-01-27 14:30


gốc


Chăm sóc để chia sẻ mã gây ra điều này? - Martin Green
@Martinsh Shaiters tôi đã viết một số sh-script để tạo ra các nguồn. Xem updt - triclosan


Các câu trả lời:


Tiêu chuẩn chỉ định một số lượng tối thiểu nhất định mà mọi triển khai đều phải hỗ trợ,

5.2.4.1 Giới hạn dịch thuật

- 127 tham số trong một định nghĩa hàm
  - 127 đối số trong một cuộc gọi hàm


13
2018-01-27 14:34



Hấp dẫn. Đó không phải là một toàn bộ rất nhiều! Tôi đã có thể nghĩ "không giới hạn, tùy thuộc vào kích thước bộ nhớ" quá. - Mr Lister
Đây là những giới hạn tối thiểu có thể chấp nhận triển khai có thể áp đặt. Nó chắc chắn cho phép (và mong muốn) để có một giới hạn lớn hơn hoặc không có giới hạn rõ ràng ở tất cả về những thứ như thế này. - R..
Ngoài ra còn có giới hạn về chiều dài tối đa của một dòng nguồn, 1K-một cái gì đó, hoặc có thể 4K-một cái gì đó. Chương trình thử nghiệm cũng có khả năng sẽ đạt đến giới hạn này. (bất cứ điều gì đến trước ...) - wildplasser
Chưa kể có một giới hạn tối đa có thể chấp nhận áp đặt bởi những người phải đọc mã của bạn, và vượt quá giới hạn này có thể gây ra hành vi không xác định ở những người đó. Vì vậy, không kéo dài nó :) - jørgensen
CR / LF tất nhiên. Dấu chấm phẩy chấm dứt một tuyên bố. - wildplasser