다음과 같이 매개 변수로 아무것도받지 않는 함수를 작성하는 것이 좋습니다.
int func(void);
그러나 나는 그것을 표현하는 올바른 방법은 다음과 같다고 들었습니다.
int func();
C와 C ++에서이 두 함수 선언의 차이점은 무엇입니까?
다음과 같이 매개 변수로 아무것도받지 않는 함수를 작성하는 것이 좋습니다.
int func(void);
그러나 나는 그것을 표현하는 올바른 방법은 다음과 같다고 들었습니다.
int func();
C와 C ++에서이 두 함수 선언의 차이점은 무엇입니까?
답변:
이 점에서 C와 C ++는 다릅니다.
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
경우 매개 변수 목록에서 를 사용하여 지정 하십시오.
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
합니다.
()
대한 선언과 가변 함수에 대한 명시 적 매개 변수 목록을 사용한 프로그램을 본 적이 없다고 생각 합니다. 이 규칙을 사용하는 프로그램의 예가 있습니까?
...
구문 으로 정의 해야 하며 하나 이상의 명명 된 매개 변수가 있어야합니다. 이러한 함수를 ()
정의하면 정의되지 않은 동작 이 발생 하며 함수 본문에서 정의 된 매크로를 사용 <stdarg.h>
하여 매개 변수 값을 읽을 수있는 방법이 없습니다. 이것은 1989/1990 표준 이후의 사례입니다.
...
.