function ()과 function (void)의 차이점은 무엇입니까? 같이 매개

다음과 같이 매개 변수로 아무것도받지 않는 함수를 작성하는 것이 좋습니다.

int func(void);

그러나 나는 그것을 표현하는 올바른 방법은 다음과 같다고 들었습니다.

int func();

C와 C ++에서이 두 함수 선언의 차이점은 무엇입니까?



답변

이 점에서 C와 C ++는 다릅니다.

C 2011 온라인 표준

6.7.6.3 함수 선언자 (시제품 포함)

10 이름이없는 유형의 매개 변수가 void목록에있는 유일한 항목 인 특수한 경우 에는 함수에 매개 변수가없는 것으로 지정됩니다.

14 식별자 목록은 함수 매개 변수의 식별자 만 선언합니다. 해당 함수 정의의 일부인 함수 선언자의 빈 목록은 함수에 매개 변수가 없음을 지정합니다. 해당 함수의 정의에 포함되지 않은 함수 선언자의 빈 목록은 매개 변수의 수 또는 유형에 대한 정보가 제공되지 않도록 지정합니다. 145)

간단히 말해서 함수 선언 의 빈 매개 변수 목록 은 함수가 지정되지 않은 수의 매개 변수를 사용함을 나타내고 , 함수 정의 의 빈 매개 변수 목록 은 함수가 매개 변수를 사용 하지 않음을 나타냅니다 .

T foo( void ); // declaration, foo takes no parameters
T bar();       // declaration, bar takes an *unspecified* number of parameters

T foo( void ) { ... } // definition, foo takes no parameters
T bar() { ... }       // definition, bar takes no parameters

C에 관한 한 함수 선언 이나 정의 에 빈 식별자 목록을 사용해서는 안됩니다 . 함수가 매개 변수를 취하도록 의도되지 않은 void경우 매개 변수 목록에서 를 사용하여 지정 하십시오.

온라인 C ++ 표준

8.3.5 함수 [dcl.fct]

4 parameter-declaration-clause 는 함수가 호출 될 때 지정할 수있는 인수와 그 처리를 결정합니다. [ 참고 : 매개 변수 선언 절은 함수 호출에 지정된 인수를 변환하는 데 사용됩니다; 5.2.2를 참조하십시오. — end note ] parameter-declaration-clause 가 비어 있으면 함수는 인수를 사용하지 않습니다. 비 종속 유형의 단일 명명되지 않은 매개 변수로 구성된 매개 변수 목록 void은 빈 매개 변수 목록과 같습니다. 이 특별한 경우를 제외하고 매개 변수는 유형을 갖지 않아야한다 cv void. 경우] 매개 변수 선언 절줄임표 또는 함수 매개 변수 팩 (14.5.3)으로 끝나는 인수의 수는 기본 인수가없고 함수 매개 변수 팩이 아닌 매개 변수의 수보다 크거나 같아야합니다. 구문 적으로 정확하고 “…”이 추상 선언의 일부가 아닌 경우 “, …”은 “…”과 동의어입니다. [ 예 : 선언

    int printf(const char*, ...);

다양한 숫자와 유형의 인수로 호출 할 수있는 함수를 선언합니다.

    printf("hello world");
    printf("a=%d b=%d", a, b);

그러나 첫 번째 인수는 const char*end example 로 변환 할 수있는 유형이어야합니다 . [ 참고 : 표준 헤더 <cstdarg>에는 줄임표 (5.2.2 및 18.10 참조)를 사용하여 전달 된 인수에 액세스하기위한 메커니즘이 포함되어 있습니다. — 끝 참고 ]

C ++의 경우 선언 또는 정의에서 빈 매개 변수 목록은 함수가 인수를 사용하지 않으며 매개 변수 목록을 사용하는 것과 동일 함을 나타냅니다 void.


답변

C에서 빈 매개 변수 목록이있는 함수 는 인수에 대해 무엇이든() 사용할 수 있습니다 . 말 그대로. 이것은 일반적으로 다양한 수의 인수를 취할 수있는 함수를 구현하는 데 사용 되지만 요즘에는 이러한 함수에 더 명확한 줄임표 구문을 사용하는 것이 바람직 합니다.(...)

C에서 매개 변수 목록이있는 함수 는 인수에 대해 (void)명시 적으로 아무 것도 취하지 않습니다 . 즉, 컴파일러는 무언가를 전달하려고하면 실제로 실수를했다고 말할 수 있습니다.

C ++에서 이러한 함수 선언은 동일합니다. 빈 매개 변수 목록은 “매개 변수 없음”을 의미 void합니다.