현대 C와 C++에서는 f(void)가 더 이상 사용되지 않는가?
나는 현재 C++ 프로젝트에 사용된 오래된 C 코드를 리팩터링/수정하고 있으며, 정기적으로 다음과 같은 기능을 본다.
int f(void)
다음과 같이 쓰고 싶다.
int f()
일관성을 높이기 위해 코드베이스 전체에 걸쳐 (void)를 ()로 교체하지 않을 이유가 있는가, 아니면 내가 모르는 두 가지 사이에 미묘한 차이가 있는가?
구체적으로는 C++의 가상 멤버 함수를 다음과 같이 기술한다.
virtual int f(void)
파생 클래스는 멤버 함수를 포함한다.
int f()
이것이 유효한 오버라이드인가?또한 거의 동일한 서명에 기반한 링커 문제가 발생할 가능성이 있는가?
C에서 선언문은int f(void)
매개 변수를 사용하지 않는 int를 반환하는 함수를 의미한다.int f()
즉, 임의의 수의 파라미터를 사용하는 int를 반환하는 함수를 의미한다.따라서 C에 파라미터가 없는 기능이 있다면 전자가 정확한 프로토타입이다.
C++에서는, 나는 믿는다.int f(void)
더 이상 사용되지 않으며,int f()
매개 변수를 사용하지 않는 함수를 의미하기 때문에 선호된다.
크리스의 대답에 더하기 위해,int f()
내 경험에 의하면, 컴파일러가 함수의 선언과 함수의 정의를 비교하는 능력을 잃었기 때문에, 함수의 선언이 정확하게 호출될 수 있도록 하는 것은 나쁜 관행이다.
예를 들어, 다음 코드는 표준 규격 C이다.
#include <stdio.h>
void foo();
void bar(void) {
foo();
}
void foo(int a) {
printf("%d\n", a);
}
하지만 그것은 정의되지 않은 행동을 낳는다, 왜냐하면a
에 전달되지 않았다.foo
.
C++에는 다음 두 가지 버전이 있다.foo
: 논쟁은 하지 않는 것과 논쟁은 하지 않는 것int
그래서.bar
정의되지 않은 버전을 호출하게 되어 링커 오류가 발생하게 된다(다른 정의는 없다).foo
어디든
이전의 답변들은 꽤 정확하지만, 나는 데이비드 트리블의 훌륭한 페이지와 연결된다. 왜냐하면 그것은 이것과 많은 다른 문제들에 대한 훌륭한 설명을 주기 때문이다.
주요 내용:
C는 빈 파라미터 목록으로 선언된 함수와 Void로만 구성된 파라미터 목록으로 선언된 함수를 구분한다.전자는 불특정 다수의 인수를 취하는 비프로토타입 함수인 반면 후자는 인수를 하지 않는 프로토타입 함수다.
반면 C++는 두 선언문을 구별하지 않고 둘 다 논쟁하지 않는 함수를 의미하는 것으로 간주한다.
C 또는 C++로 컴파일하려는 코드의 경우, 이 문제에 대한 최선의 해결책은 명시적 보이드 프로토타입으로 매개변수를 사용하지 않는 함수를 항상 선언하는 것이다.
빈 기능 프로토타입은 C99(C89에서와 같이)에서 더 이상 사용되지 않는 기능이다.
펑크(void) 구문이 C++에서 더 이상 사용되지 않는다는 것은 아마도 주목할 필요가 있을 것이다. 그러나 그것은 일반적으로 C형 관용어에 더 가깝다고 여겨진다.내가 만난 대부분의 C++ 프로그래머들은 빈 매개변수 목록을 선호한다고 생각한다.
C++ 표준, 섹션 8.3.5, 단락 2에서 인용:
"매개변수 선언-일시 중지(marameter-declation-clause)가 비어 있으면 함수는 논거를 취하지 않는다매개 변수 목록(void)은 빈 매개 변수 목록과 동일하다.이 특별한 경우를 제외하고, void는 매개변수 형식(void*와 같이 void에서 파생된 형식은 can)이 되어서는 안 된다."
그 두 가지 형태 모두 더 이상 사용되지 않는다는 언급은 없다.나에게 표준의 정확한 부분을 알려준 미스터 트리블의 훌륭한 웹사이트에 다시 한번 감사한다.
void f()
더 이상 사용되지 않는다.void f(void)
권장:
6.11.6 기능 해제기:
1 빈 괄호(시제품 형식 매개변수 형식 선언기가 아님)가 있는 함수 선언기의 사용은 모호한 기능이다.
소개:
2 특정 특성은 모호하며, 이는 이 국제 표준의 향후 개정에서 철회를 고려할 수 있음을 의미한다.그것들은 널리 사용되기 때문에 유지되지만, 새로운 구현(구현 기능용)이나 새로운 프로그램(언어 [6.11] 또는 라이브러리 기능 [7.31])에서는 사용이 금지된다.
자세한 설명: https://stackoverflow.com/a/36292431/895245
둘 다 아니다.void f(void)
아닌void f()
더 이상 사용되지 않는다.
void f(void)
C와의 호환성을 위해 존재한다.부속문서 C "호환성" C.1.7 조항 8: 선언기:
8.3.5 변경:C ++에서 빈 매개 변수 목록으로 선언된 함수는 인수를 사용하지 않는다.C에서 빈 매개 변수 목록은 함수 인수의 수와 유형을 알 수 없음을 의미한다.
이후void f()
C에서 더 이상 사용되지 않으며void f(void)
권장된void f(void)
C++가 호환성을 유지하기를 원하는 한 존재할 것이다.
void f(void)
그리고void f()
C++도 동일하다.그래서 더 길어질수록void f(void)
C와 C++ 둘 다 아래 컴파일된 코드를 쓰는 것에 신경을 쓸 때만 말이 되는데, 그것은 그럴 가치가 없을 것 같다.
자세한 설명: https://stackoverflow.com/a/36835303/895245
tl;dr: 사용void
.
C++의 역호환성과 아래에 제시된 약간의 모호성을 고려할 때, 나는 결정적인 해답을 얻기 위해 K&R과 ANSI C까지 거슬러 올라갈 것을 단언한다.
int getline(void);
int copy(void)
getline과 copy의 전문 버전은 논쟁거리가 없기 때문에, 논리는 파일 시작 부분의 그들의 프로토타입이
getline()
그리고copy()
그러나 이전 C 프로그램과의 호환성을 위해 표준은 빈 목록을 구식 선언으로 사용하고 모든 인수 목록 확인을 해제한다.void
명시적으로 비어 있는 목록에 사용해야 한다.[Kernighan & Richie, C 프로그래밍 언어, 1988, Pgs 32-33]
그리고..
빈 인수 목록의 특별한 의미는 오래된 C 프로그램이 새로운 컴파일러와 컴파일을 할 수 있도록 하기 위한 것이다.하지만 그것을 새로운 프로그램과 함께 사용하는 것은 좋지 않은 생각이다.함수가 인수를 할 경우 인수를 선언하고 인수를 하지 않을 경우 보이드를 사용하십시오 [ibid, 페이지 73].
나는 여기서 나머지를 별개의 토론으로 나누었다: 논쟁을 전혀 하지 않는 기능의 선언에 공백의 사용을 명시하는 것은 The Most Vexing Parse를 다루고 있는가?
C++에서는int f(void)
실제로 100% 에 해당하는 더 이상 사용되지 않는 선언이다.int f()
그것은 같은 서명이다.그void
이 맥락에서 공백과 같이 중요하다.그것은 또한 그들이 단일 정의 규칙(과부하하지 않음)의 적용을 받고 있다는 것을 의미하기도 한다.Derived::f(void)
재지정하다Base::f()
.
그런 것 가지고 장난치지 마.f(const void)
그래도.그런 괴상한 것이 무슨 뜻인지 공감대가 많지 않다.
참조URL: https://stackoverflow.com/questions/416345/is-fvoid-deprecated-in-modern-c-and-c
'programing' 카테고리의 다른 글
항상 0을 반환하는 Vue에서 로드 시 이미지 크기 계산 (0) | 2022.04.20 |
---|---|
시스템 클래스를 조롱하는 동안 Mockito + PowerMock LinkingError (0) | 2022.04.20 |
Mac에서 codekit을 사용하여 Vue JS 프로젝트를 설정하는 방법 (0) | 2022.04.20 |
값을 vue 인스턴스에 전달하는 방법? (0) | 2022.04.20 |
V-툴팁:메서드에서 팝업 닫기 (0) | 2022.04.20 |