programing

함수 선언의 최대 매개 변수 수

lastcode 2023. 10. 29. 19:46
반응형

함수 선언의 최대 매개 변수 수

함수 정의에서 매개 변수의 최소 개수는 0개로 알고 있습니다만, 함수 정의에서 매개 변수의 최대 개수는 몇 개입니까?나는 단지 지식을 위해서 그리고 호기심 때문에 질문하는 것이지, 내가 실제 기능을 쓰려는 것은 아닙니다.

네, 시행에 따른 제한이 있습니다.답변은 C++ 표준에서 발췌한 다음과 같이 굵은 글씨로 제공됩니다.

1. C++ 언어


부속서 B - 구현 수량

  1. 컴퓨터는 유한하기 때문에 C++ 구현은 성공적으로 처리할 수 있는 프로그램의 크기에 제한이 있을 수밖에 없습니다.모든 구현은 알려진 경우 이러한 제한을 문서화해야 합니다.이 문서에서는 고정 한계가 존재하는 곳을 인용하거나, 사용 가능한 자원의 함수로 가변 한계를 계산하는 방법을 설명하거나, 고정 한계가 존재하지 않거나 알 수 없다고 설명할 수 있습니다.

  2. 한계치는 아래에 설명된 것이나 다른 것을 포함하는 수량을 제한할 수 있습니다.각 수량에 이어 괄호로 표시된 숫자가 해당 수량의 최소값으로 권장됩니다.그러나 이러한 수량은 지침일 뿐 준수 여부를 결정하는 것은 아닙니다.
    — 복합문의 네스팅 레벨, 반복 제어 구조 및 선택 제어 구조 [256].
    — 조건부 포함의 네스팅 수준 [256].
    — 포인터, 배열 및 함수 선언자(어떤 조합이든)는 선언에서 산술, 구조, 결합 또는 불완전한 유형을 수정합니다 [256].
    — 전체 표현식 내 괄호로 묶은 표현식의 네스팅 수준 [256].
    — 내부 식별자 또는 매크로 이름의 문자 수 [1024].
    — 외부 식별자의 문자 수 [1024].
    — 하나의 번역 유닛에 외부 식별자가 있습니다 [65536].
    — 블록 범위가 하나의 블록에 선언된 식별자 [1024].
    — 하나의 번역 유닛에 동시에 정의된 매크로 식별자 [65536].
    — 하나의 함수 정의에 있는 파라미터 [256].
    — 한 함수의 인수는 [256]을 호출합니다.

    — 하나의 매크로 정의에 포함된 파라미터 [256].
    — 하나의 매크로 호출에서 인수 [256].
    — 하나의 논리적 소스 라인에 있는 문자 [65536].
    — 문자열 리터럴 또는 와이드 문자열 리터럴의 문자(연결 후) [65536].
    — 객체의 크기 [262 144].
    — #에 대한 네스팅 수준은 [256] 파일을 포함합니다.
    — 스위치 문에 대한 대소문자 라벨(네스팅된 스위치 문에 대한 라벨은 제외) [16 384]
    — 단일 클래스, 구조 또는 조합의 데이터 구성원 [16384].
    — 단일 열거형의 열거 상수 [4096].
    — 단일 구조 선언 목록의 중첩 클래스, 구조 또는 조합 정의 수준 [256].
    — 출구()[32]에 의해 등록된 기능.
    — 직접 및 간접 베이스 클래스 [16384].
    — 단일 클래스에 대한 직접 기본 클래스 [1024].
    — 구성원들은 단일 클래스로 선언되었습니다 [4096].
    — 액세스 가능 여부와 관계없이 클래스의 가상 기능을 최종 재정의합니다 [16384].
    — 클래스의 직접 및 간접 가상 베이스 [1024].
    — 클래스의 정적 멤버 [1024].
    — 클래스의 친구 선언 [4096].
    — 클래스의 액세스 제어 선언 [4096].
    — 생성자 정의의 멤버 이니셜라이저 [6144].
    — 하나의 식별자의 범위 자격[256].
    — 내포된 외부 사양 [1024].
    — 템플릿 선언의 템플릿 인수 [1024].
    — 재귀적으로 중첩된 템플릿 인스턴스화 [17].
    — 시도 블록당 처리기 [256].
    — 단일 함수 선언에 사양을 던집니다 [256].

게다가 $18.3/6이라고 적혀있더군요

구현 제한:구현은 최소 32개 기능의 등록을 지원해야 합니다.

2. C언어


5.2.4.1 번역 한계


구현은 다음과 같은 제한사항들적어도 하나의 인스턴스를 포함하는 프로그램번역하고 실행할 수 있어야 합니다.
— 127 블록의 둥지 레벨
— 조건부 포함 63개의 중첩 수준
— 12개의 포인터, 배열 및 함수 선언자(어떤 조합이든지), 산술, 구조, 결합 또는 선언의 불완전한 유형 수정
— 전체 선언자 내 괄호가 있는 선언자의 63개의 중첩 수준
— 63개의 완전한 표현식 내 괄호로 묶은 표현식 수준
— 내부 식별자 또는 매크로 이름에서 63개의 중요한 초기 문자(각 범용 문자 이름 또는 확장된 소스 문자는 단일 문자로 간주됨)
— 외부 식별자에서 31개의 중요한 초기 문자(각 범용 문자 이름)
0000000000정FFFF 하면 되고, 00010000 이상의 식별자를 은 10자로 간주되며, 각 확장된 소스 문자는 해당 범용 문자명과 동일한 수의 문자로 간주됩니다FFFF 이하는 6자, 00010000 이상의 짧은 식별자를 지정하는 각 범용 문자 이름은 10자, 각 확장된 소스 문자는 해당 범용 문자 이름과 동일한 수의 문자로 간주됨)
— 하나의 번역 단위에 4095개의 외부 식별자가 포함
— 블록 범위가 하나의 블록에 선언된 511개의 식별자
— 4095 매크로 식별자가 하나의 전처리 번역 단위에서 동시에 정의됨
— 하나의 함수 정의에서 127개의 매개 변수
— 하나의 함수 호출에서 127개의 인수

— 하나의 매크로 정의에서 127개의 파라미터
— 하나의 매크로 호출에서 127개의 인수
— 논리적 소스 라인에 있는 4095자
— 문자열 리터럴 또는 와이드 문자열 리터럴에 4095자(연결 후)
— 개체에서 65535바이트(호스트 환경에서만)
— #included 파일에 대한 15개의 중첩 수준
— 스위치 문에 대한 1023개의 대소문자 레이블(네스트된 스위치 문에 대한 레이블 제외)
— 단일 구조 또는 조합에 1023명의 조합원
— 단일 열거에 1023개의 열거 상수
— 63 단일 구조-declar-리스트에 중첩된 구조 또는 조합 정의 수준

하지만, 메모에는 이렇게 적혀있습니다.

- 가능한 한 번역에 제한을 두지 않아야 합니다.

이전 답변자들이 충분히 언급했듯이 매개 변수의 수는 C++ 컴파일러에 따라 달라집니다.컴파일러 제한은 하드웨어 환경에 따른 제한 때문일 수 있습니다.

예를 들어 VAX CPU 아키텍처는 인수 수를 유지하는 8비트 필드를 사용하므로 준수 VAX 코드는 255개 이상의 매개 변수를 전달할 수 없습니다.

마찬가지로 Intel 8048 제품군과 같은 많은 소형 프로세서들은 메모리에 제약을 많이 받기 때문에 대부분의 C 및 C++ 컴파일러들은 4개 이상의 매개 변수를 사용할 경우 어려움을 겪게 됩니다.많은 메인스트림 개발자들이 8048을 비웃을지 모르지만, 그 후손들은 대부분 임베디드 장치에 배치된 가장 광범위한 CPU 중 하나로 남아 있습니다.

많은 RISC 아키텍처 구현은 스택이 아닌 레지스터를 사용하여 매개 변수 전달 방법을 지정합니다.예를 들어 기본 ARM CPU에는 16개의 레지스터만 있습니다.매개 변수의 최대 수는 매개 변수를 전달할 코드를 생성하는 방법에 영향을 미치는 컴파일러 명령줄 옵션에 따라 달라질 수 있습니다.아마 8개 이상이 스택에 밀어 넣었을 겁니다.아닐 수도 있습니다.

예가 지나치게 제한적인 것처럼 보일 경우 Palm OS가 C 함수를 단일 매개 변수로 제한하고 유형이 되어야 한다는 점을 고려하십시오.int아니면void *.

물론 이렇게 많은 인수를 사용하여 C에서 함수를 작성하는 경우 프로그램의 설계를 다시 생각해 볼 수 있습니다.

언급URL : https://stackoverflow.com/questions/4582012/maximum-number-of-parameters-in-function-declaration

반응형