답변:
에서 C :
void foo()
" foo
지정되지 않은 유형의 지정되지 않은 인수를 취하는 함수"를 의미void foo(void)
수단 "함수가 foo
인수를 고려하지 않습니다"에서 C ++ :
void foo()
" foo
인수하지 않는 함수"를 의미 void foo(void)
수단 "함수가 foo
인수를 고려하지 않습니다"따라서을 작성함으로써 foo(void)
두 언어 모두에서 동일한 해석을 달성하고 헤더를 다국어로 만듭니다 (일반적으로 헤더를 실제로 교차 언어로 만들려면 헤더에 더 많은 작업을 수행해야합니다. 즉, extern "C"
컴파일 하는 경우 C ++).
void
"가장 까다로운 파싱"문제를 피할 수있었습니다.
void foo()
를 선언하는 유일한 구문이었습니다. 서명이 도입 된 시점에서 C위원회는 이전 구문에서 매개 변수 없음을 명확히하고 구문을 도입해야했습니다 void foo(void)
. C ++은 호환성을 위해 사용했습니다.
void foo()
대신 C를 사용 void foo(void)
하면 기능상의 차이가 발생하는 C C90 이상의 예를들 수 있습니까 ? 즉, 몇 년 동안 공백없이 버전을 사용 해 왔으며 아무런 문제가 없었습니다.
void foo() { if ( rand() ) foo(5); }
컴파일하고 실행합니다 (매우 운이 없다면 정의되지 않은 동작을 일으킴) void foo(void)
. 동일한 본문을 사용하면 컴파일 오류가 발생합니다.
귀하의 질문이 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. parameter-declaration-clause는 함수가 호출 될 때 지정할 수있는 인수와 그 처리를 결정합니다. [...] 매개 변수 선언 절이 비어 있으면 함수는 인수를 사용하지 않습니다. 매개 변수 목록 (void)은 빈 매개 변수 목록과 같습니다.
C99
C ++ 11에서 언급했듯이 int f()
인수에 대해서는 아무것도 지정하지 않으며 더 이상 사용되지 않습니다.
작동 코드 또는 UB로 이어질 수 있습니다.
https://stackoverflow.com/a/36292431/895245 에서 C99 표준을 자세히 해석했습니다.