문제

다음 두 가지 함수 정의를 고려하세요.

void foo() { }

void foo(void) { }

이 둘 사이에 차이점이 있나요?그렇지 않다면 왜? void 거기 논쟁?미학적 이유?

도움이 되었습니까?

해결책

~ 안에 :

  • void foo() "함수를 의미한다 foo 지정되지 않은 유형의 지정되지 않은 개수의 인수를 사용하는 중입니다."
  • void foo(void) "함수를 의미한다 foo 어떤 주장도 받아들이지 않아"

~ 안에 C++:

  • void foo() "함수를 의미한다 foo 어떤 주장도 받아들이지 않아"
  • void foo(void) "함수를 의미한다 foo 어떤 주장도 받아들이지 않아"

글을 써서 foo(void), 따라서 우리는 두 언어 모두에서 동일한 해석을 달성하고 헤더를 다국어로 만듭니다(그러나 실제로 교차 언어로 만들려면 일반적으로 헤더에 대해 몇 가지 추가 작업을 수행해야 합니다).즉, 그것들을 extern "C" C++를 컴파일하는 경우).

다른 팁

귀하의 질문이 C++에 관한 것이라는 것을 알고 있지만 C에 관한 답변은 K&R, 페이지 72-73에서 찾을 수 있습니다.

또한 함수 선언에 인수가 포함되어 있지 않은 경우

double atof();

그것은 또한 Atof의 주장에 대해 아무것도 가정 할 것이 없다는 것을 의미하는 것으로 간주된다.모든 매개변수 검사가 꺼집니다.빈 인기 목록 의이 특별한 의미는 이전 C 프로그램이 새로운 컴파일러로 컴파일 할 수 있도록하기위한 것입니다.그러나 새로운 프로그램과 함께 사용하는 것은 나쁜 생각입니다.함수가 인수를 취하는 경우 인수를 선언하세요.인수가 필요하지 않으면 void를 사용하십시오.

C++11 N3337 표준 초안

다른 점이 없다.

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

부록 C "호환성" C.1.7 조항 8:선언자 말한다:

8.3.5 변경:C++에서 빈 매개변수 목록으로 선언된 함수는 인수를 사용하지 않습니다.C에서 빈 매개 변수 목록은 함수 인수의 숫자와 유형을 알 수 없음을 의미합니다.

예:

int f();
// means int f(void) in C ++
// int f( unknown ) in C

이론적 해석:이는 잘못된 기능 호출을 피하기위한 것입니다 (즉, 잘못된 번호 또는 인수 유형을 가진 함수 호출).

원래 기능에 미치는 영향:잘 정의된 기능의 의미로 변경합니다.이 기능은 C에서 "더 이상 사용되지 않는" 것으로 표시되었습니다.

8.5.3 기능 말한다:

4.매개 변수 폐지-클라스는 함수를 호출 할 때 지정할 수있는 인수와 해당 처리를 결정합니다....] 매개 변수 폐지 클라스가 비어 있으면 함수는 인수를 취하지 않습니다.매개변수 목록(void)은 빈 매개변수 목록과 동일합니다.

C99

C++11에서 언급했듯이, int f() 인수에 대해 아무것도 지정하지 않으며 더 이상 사용되지 않습니다.

작업 코드 또는 UB로 이어질 수 있습니다.

나는 C99 표준을 다음에서 자세히 해석했습니다. https://stackoverflow.com/a/36292431/895245

C에서는 빈 함수 참조에 void를 사용하여 컴파일러에 프로토타입이 있고 해당 프로토타입에 "인수 없음"이 있습니다.C++에서는 프로토타입을 생략할 수 없기 때문에 프로토타입이 있다는 것을 컴파일러에 알릴 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top