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


27

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

int func(void);

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

int func();

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


5
이것은 다른 사람의 사이에서, 사이트 네트워크에있는 수천 다른 질문의 중복 stackoverflow.com/questions/18167390/...
라스 Viklund

@LarsViklund이 사이트에 질문이있는 경우에만 중복됩니다. 하나를 찾을 수 없으므로 SO에 관계없이 중복되지 않습니다. 아마도이 질문을 푯말로 유지하는 것이 좋습니다.


1
@LightnessRacesinOrbit 은 채팅에서 토론 하고 몇 가지 수정 사항을 적용하기로 결정했습니다.

답변:


17

이 점에서 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.


35

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

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

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


Re : "이것은 일반적으로 다양한 개수의 인수를 취할 수있는 함수를 구현하는 데 사용됩니다": 이것에 대해 확신하십니까? 가변 변수가 아닌 함수에 ()대한 선언과 가변 함수에 대한 명시 적 매개 변수 목록을 사용한 프로그램을 본 적이 없다고 생각 합니다. 이 규칙을 사용하는 프로그램의 예가 있습니까?
ruakh

4
AC 가변 함수 ... 구문 으로 정의 해야 하며 하나 이상의 명명 된 매개 변수가 있어야합니다. 이러한 함수를 ()정의하면 정의되지 않은 동작 이 발생 하며 함수 본문에서 정의 된 매크로를 사용 <stdarg.h>하여 매개 변수 값을 읽을 수있는 방법이 없습니다. 이것은 1989/1990 표준 이후의 사례입니다.
키이스 톰슨

@ KeithThompson :이 질문 과이 답변은 함수 정의가 아닌 사전 선언에 대해 이야기하고 있습니다.
ruakh

3
@ruakh : 정의 되지 않은 동작을 피 하려면 구문을 사용하여 가변 함수를 선언 하고 정의 해야합니다 ....
Keith Thompson
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.