문제

현재 C ++ 프로젝트에 사용되는 오래된 C 코드를 리팩토링/정리하고 다음과 같은 기능을 정기적으로 볼 수 있습니다.

int f(void)

나는 다음과 같이 쓰는 경향이 있습니다.

int f()

일관성을 향상시키기 위해 코드베이스 전체에서 (void) (void)를 (void)로 대체하지 않아야 할 이유가 있습니까? 아니면 내가 알지 못하는 두 사람 사이에 미묘한 차이가 있습니까? 보다 구체적으로, C ++의 가상 멤버 함수가 다음과 같이 설명되는 경우.

virtual int f(void)

파생 클래스에는 멤버 기능이 포함됩니다.

int f()

이것이 유효한 재정의입니까? 또한 거의 동일한 서명을 기반으로 링커 문제가 발생할 가능성이 있습니까?

도움이 되었습니까?

해결책

C에서 선언 int f(void) 매개 변수가없는 함수 리턴 int를 의미합니다. 선언 int f() 여러 매개 변수를 취하는 함수 리턴 int를 의미합니다. 따라서 C에서 매개 변수를 사용하지 않는 함수가있는 경우 전자는 올바른 프로토 타입입니다.

C ++에서는 믿습니다 int f(void) 더 이상 사용되지 않습니다 int f() 구체적으로 매개 변수를 취하지 않는 함수를 의미하므로 선호됩니다.

다른 팁

Chris의 답변에 추가하려면 사용합니다 int f() 컴파일러가 함수의 선언을 정의와 비교하여 올바르게 호출되도록하는 기능을 잃어 버릴 수있는 능력을 잃어 버리기 때문에 C에서 나쁜 관행입니다.

예를 들어 다음 코드는 표준 호환 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 어딘가에).

위의 답변은 매우 정확하지만 David Tribble의 훌륭한 페이지와 연결하고 있습니다. 훌륭한 설명 이것과 다른 많은 문제에.

하이라이트 :

c는 빈 매개 변수 목록으로 선언 된 함수와 공극만으로 구성된 매개 변수 목록으로 선언 된 함수를 구별합니다. 전자는 지정되지 않은 수의 인수를 취하는 불명예스러운 기능이며, 후자는 인수를 취하지 않는 프로토 타입 기능입니다.

반면에 C ++는 두 선언을 구분하지 않으며 둘 다 인수가없는 함수를 의미한다고 생각합니다.

C 또는 C ++로 컴파일 된 코드의 경우,이 문제에 대한 가장 좋은 솔루션은 항상 명시 적 공간 프로토 타입으로 매개 변수를 취하지 않는 함수를 항상 선언하는 것입니다.

빈 함수 프로토 타입은 C99의 더 이상 사용되지 않은 기능입니다 (C89에서와 같이).

편집 : 표준을 살펴본 후에는 func (void) 구문이 ~ 아니다 C ++에서는 더 이상 사용되지 않지만 일반적으로 C 스타일의 관용구로 간주됩니다. 내가 실행하는 대부분의 C ++ 프로그래머는 빈 매개 변수 목록을 선호한다고 생각합니다.

편집 2 : C ++ 표준, 섹션 8.3.5, 2 항에서 인용문 추가 : 2 항 :

"매개 변수 -Declaration-Clause가 비어 있으면 함수는 인수를 취하지 않습니다. 매개 변수 목록 (void)은 빈 매개 변수 목록과 동일합니다.이 특수한 경우를 제외하고는 void는 매개 변수 유형이되어서는 안됩니다 (void에서 파생 된 유형. , void*, can)와 같은. "

양식 중 하나가 더 이상 사용되지 않는다는 언급은 없습니다. 표준의 올바른 섹션을 가리키는 Mr. Tribble의 훌륭한 웹 사이트에 다시 한번 감사드립니다.

tl; dr : 사용 void.

C ++의 후진 호환성과 아래에 식별 된 비트의 모호성을 감안할 때, 나는 우리가 결정적인 대답을 위해 KNR과 Ansi C로 돌아가는 것을 주장합니다.

int getline(void);
int copy(void)

GetLine 및 Copy의 특수 버전에는 인수가 없으므로 Logic은 파일 시작시 해당 프로토 타입이 getline() 그리고 copy(). 그러나 이전 C 프로그램과의 호환성을 위해 표준은 빈 목록을 구식 선언으로 취하고 모든 인수 목록 확인을 끕니다. 단어 void 명시 적으로 빈 목록에 사용해야합니다. [Kernighan & Richie, C Programming Language, 1988, PGS 32-33

그리고..

빈 인수 목록의 특별한 의미는 이전 C 프로그램이 새로운 컴파일러로 컴파일 할 수 있도록하기위한 것입니다. 그러나 새로운 프로그램과 함께 사용하는 것은 나쁜 생각입니다. 함수가 인수를 받으면 선언하십시오. 인수가 필요하지 않으면 void [ibid, pg. 73

편집 : 나머지는 별도의 토론으로 나누었습니다.인수를 취하지 않는 함수 선언에서 공극의 사용을 지정하면 가장 욕설이 가장 큰 구문 분석이 해결됩니까?

C11 N1570 표준 초안

void f() 더 이상 사용되지 않고 void f(void) 권장 :

6.11.6 기능 선언자:

1 빈 괄호가있는 함수 선언자 (프로토 타입 형식 매개 변수 유형 선언자가 아님)를 사용하는 것은 노란 기능입니다.

소개:

2 특정 특징은 노골적 이므로이 국제 표준의 향후 개정에서 철수로 간주 될 수 있음을 의미합니다. 그들은 광범위한 사용으로 인해 유지되지만 새로운 구현 (구현 기능) 또는 새로운 프로그램 (언어 [6.11] 또는 라이브러리 기능 [7.31])에서의 사용은 권장되지 않습니다.

자세한 토론 : https://stackoverflow.com/a/36292431/895245

C ++ 11 N3337 표준 초안

어느 것도 아니다 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

C ++에서 int f(void) 실제로 100% 동등한 감가 상각 된 선언입니다. int f(). 그것 ~이다 같은 서명. 그만큼 void 이러한 맥락에서 예를 들어 공백만큼 중요합니다. 또한 하나의 정의 규칙 (과부하하지 않음)과 Derived::f(void) 재정의 Base::f().

같은 물건을 엉망으로 만들지 마십시오 f(const void), 그렇지만. 그런 이상한 것이 의미하는 바가 많지 않습니다.

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