C++ 또는 C에서 foo(void)와 foo() 사이에 차이점이 있습니까?
문제
다음 두 가지 함수 정의를 고려하세요.
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++에서는 프로토타입을 생략할 수 없기 때문에 프로토타입이 있다는 것을 컴파일러에 알릴 필요가 없습니다.