C ++ 또는 C에서 foo (void)와 foo () 사이에 차이가 있습니까?


253

다음 두 함수 정의를 고려하십시오.

void foo() { }

void foo(void) { }

이 둘 사이에 어떤 차이가 있습니까? 그렇지 않다면 왜 void논쟁이 있습니까? 미적 이유?


C의 경우 Q / A가 여기 있습니다
Antti Haapala

답변:


317

에서 C :

  • void foo()" foo지정되지 않은 유형의 지정되지 않은 인수를 취하는 함수"를 의미
  • void foo(void)수단 "함수가 foo인수를 고려하지 않습니다"

에서 C ++ :

  • void foo()" foo인수하지 않는 함수"를 의미
  • void foo(void)수단 "함수가 foo인수를 고려하지 않습니다"

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


10
그러나 C ++에서을 요구했다면 void"가장 까다로운 파싱"문제를 피할 수있었습니다.
Adrian McCarthy

5
사실, C ++에는 너무 많은 다른 엉터리 파싱이 있지만 그중 하나에 대한 kvetching에는 실제 요점이 없습니다.
DrPizza

16
최근의 질문에서 @James Kanze는 흥미로운 재미있는 소식을 올렸습니다. C의 첫 번째 버전에서는 함수가 취할 수있는 매개 변수의 수를 지정할 수 없었으므로 함수 void foo()를 선언하는 유일한 구문이었습니다. 서명이 도입 된 시점에서 C위원회는 이전 구문에서 매개 변수 없음을 명확히하고 구문을 도입해야했습니다 void foo(void). C ++은 호환성을 위해 사용했습니다.
Matthieu M.

3
void foo()대신 C를 사용 void foo(void)하면 기능상의 차이가 발생하는 C C90 이상의 예를들 수 있습니까 ? 즉, 몇 년 동안 공백없이 버전을 사용 해 왔으며 아무런 문제가 없었습니다.
chacham15

6
@ chacham15는 void foo() { if ( rand() ) foo(5); } 컴파일하고 실행합니다 (매우 운이 없다면 정의되지 않은 동작을 일으킴) void foo(void). 동일한 본문을 사용하면 컴파일 오류가 발생합니다.
MM

39

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

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

double atof();

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


그러나 문제는 정의에 관한 것입니다.이 경우 관련 C 규칙은 해당 함수의 정의의 일부인 함수 선언자의 빈 목록은 함수에 매개 변수가 없음을 지정합니다.
jinawee

9

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 표준을 자세히 해석했습니다.


2

C에서는 빈 함수 참조에 void를 사용하여 컴파일러에 프로토 타입이 있고 해당 프로토 타입에 "인수가 없음"이 있습니다. C ++에서는 프로토 타입을 생략 할 수 없기 때문에 컴파일러에게 프로토 타입이 있다고 알려주지 않아도됩니다.


1
"prototype"은 인수 목록 선언 및 반환 유형을 의미합니다. "시제품"이 처음에 무슨 의미인지 혼동했기 때문에 나는 이것을 말한다.
잔 Lynx
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.