C ++ 코드에서 C 표현식을 사용하는 것이 좋은 습관입니까?


19

학교에서 우리는 수업을 앞두고 있다는 사실에도 불구하고 올해 C를 배우기 시작했으며 수업이 C의 기초에있는 동안 Java, C ++ 및 C를 배웠습니다. 나는 왜 선생님에게 C를 배워야하는지 물었고 C ++의 기초라고 말했다. 프로그래밍을 처음 시작했을 때 C ++이 더 쉽다는 것을 알게되었고 나중에 C를 배웠습니다. 그러나 책에서 C 코드가 C ++에서 작동하지만 그 반대는 아니라는 것을 알 수 있습니다.

내 질문은 매우 간단합니다 ~ C ++에서 C 표현식을 사용하는 것이 좋은 습관입니까? 예를 들어 보겠습니다.

이 코드는

#include <stdio.h>
#include <iostream>

int main() {
int x;
scanf("%d", &x);
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

이보다 더 효율적이거나 더 나은 방법을 찾으십시오.

#include <iostream>

int main() {
int x;
cin >> x;
cout << "The number you entered is " << x << "And it's double is " << x*x;
return 0;
}

나는 먼지가 많은 오래된 책에서 이미 이것에 대한 쉬운 문서를 작성했으며 cout 대신 scanf를 사용하여 스트림이나 그와 비슷한 것을 플러시합니다. 따라서 기본적으로 scanf를 사용하는 것이 더 나은지 묻습니다. 어떤 맥락.

필자는 항상 FIle IO가 C ++보다 C에서 더 쉽다는 것을 알았으므로 파일 IO에도 적용됩니다. 이 질문은 C의 C에서 거의 모든 일반 표현식에 적용됩니다. 또한 현대 컴파일러를 사용하고 있음에도 주목할 만하지 만 C ++ 코드에서 C 표현식을 사용하는 것이 좋은 프로그래밍 습관인지 묻기 때문에 이것이 중요하지 않습니다.

아마도 이것의 단점과 장점이 있지만 나는 예 / 왜, 아니오 / 왜 대답 유형만을 찾고 있습니다.

또한 세부 사항이 있으면 의견을 남겼습니다.


12
혼합에 대한 진짜 조심 stdio하고 iostream. 제품군 내에서 반드시 적용 할 필요는없는 특정 순서 및 동기화가 보장됩니다.
David Thornley 2012

팁 주셔서 감사하지만 해당 코드 스크랩은 순수한 예입니다. 어쨌든 고마워
Bugster

25
프로그래밍을 배우고 있다면; 당신은 적절한 들여 쓰기를 배워야한다!
비트 마스크

5
scanf ()는 좋은 예가 아닙니다. C 또는 C ++에서는 피하는 것이 좋습니다.
Russell Borogove가

1
샘플 코드 일 수도 있지만 David의 의견은 실제로 C ++로 프로그래밍 할 때 C 관용구를 사용 해서는 안되는 문제의 핵심을 이룹니다. 그들은 완전히 다른 언어입니다. Java와 C 또는 C ++과 Visual Basic을 혼동하는 것 이상으로 혼동하지 마십시오.
코디 그레이

답변:


36

아니요, 나쁜 습관입니다. 생계를 위해이 작업을 수행하면 팀이 준수하는 스타일 가이드를 위반하게 될 수 있습니다 (또는 최소한 코드 검토 중에 혼란에 빠질 수 있습니다).

예, 작동하지만 C ++에 해당하는 경우 사용하십시오. (예 : printfs와 섞지 마십시오 couts)


+1-짧고 요점. 그리고 이것은 팀 가이드 라인이 사람들을 모으고 통합하여 그들이 함께 일할 수 있도록 도와주는 내 대답의 요점을 강조합니다.
jmort253

이 의견은 내 질문에 올바르게 대답하고 확실한 논쟁을 불러옵니다. 감사합니다.
Bugster

1
@ ThePlan 감사합니다. 모두이 질문에 대한 훌륭한 답변을 얻었습니다.
jglouie 2012

1
참고 : printf일관성있게 사용하면 일관성있게 사용하는 것뿐만 아니라 작동 cout합니다. 유일한 문제는 그것들과 스타일을 섞는 것입니다.
user253751

C ++에 해당하지 않는 C 기능의 예를 들어 줄 수 있습니까?
klutt

20

일반적으로 C와 C ++는 마치 완전히 별개의 두 언어 인 것처럼 보입니다. 따라서 C ++ 프로그램에서 C 구문을 사용하는 것은 잘못된 형식으로 간주 될 수 있습니다.

당신이 올바른지; 그러나 C 코드는 정상적으로 컴파일됩니다. 표준 준수 측면에서 회사의 유연성에 달려 있습니다. 인터뷰에서 질문을 받았다면 C가 C ++에서 작동하지만 C와 C ++은 두 가지 별도의 언어이므로 인터뷰 담당자에게 알려 주어야합니다. 그렇게하는 좋은 이유.

고려해야 할 또 다른 사항은 표준이 더 많은 사람들이 코드로 쉽게 작업 할 수있는 플랫폼을 만드는 데 도움이된다는 것입니다. 당신이 C를 배우도록 격려하는 선생님을 갖는 것은 운이 좋았지 만 모두가 운이 좋은 것은 아닙니다. 따라서 C ++ 프로그램에서 C를 혼합하면 C를 배우지 못한 사람에게는 혼란 스러울 수 있습니다.

요약하면, 당신이 무언가를 할 수 있다고해서 꼭해야한다는 것을 의미하지는 않으며, 무언가를하지 말아야한다는 것이 당신이 할 수 없다는 것을 의미하지는 않습니다. :)


내가 참조. 기능은 어떻습니까? C 구문이 C ++ 구문보다 나은 특별한 경우가 있습니까?
Bugster

10

C ++은 설계 상으로 C와 역 호환되므로 일반적으로 C 코드는 C ++ 컴파일러에 의해 컴파일됩니다 ( 일반적으로 C에없는 추가 예약어가 C에없고 컴파일을 중단하는 C 코드에 사용될 수 있음).

그러나 코드를 믹싱하는 것은 나쁜 습관이라고 생각합니다. 당신이 사용하는 경우 scanf- 사용 printf, 당신이 사용하는 경우 operator >>- 사용 operator <<. 오버로드 된 C ++ 연산자가 사용자가 모르는 기능을 캡슐화 할 수 있고 일치하지 않으면 프로그램이 원하지 않는 작업을 수행 할 수 있습니다.

C ++ 코드에서 C 구문을 선호하는 특별한 이유는 없으며 다른 언어이며 C ++ 코드에서 C 구문을 사용할 때 여전히 강력한 도구를 많이 사용하지 않고 C ++ 코드를 작성 하고 있습니다.


5
C와 C ++의 비 호환성은 단순한 키워드 그 이상입니다. 타이핑 시스템이 변경되고 C에 존재하는 기능 (특히 C99)이 있으며 C ++에는 존재하지 않습니다. (예 : 가변 길이 배열).
Arafangion 2019

9

코딩 스타일과 미적 문제를 제외하면 C ++ 코드에서 C를 사용할 때 직면하게되는 여러 가지 기술적 문제가 있습니다.

  • C 란? C90, C99 또는 C11? 사용중인 C 표준에 따라 다양한 호환성 문제가있을 수 있습니다. 부울 형식, // 주석, VLA와 같은 C99 기능, 지정된 이니셜 라이저 등

  • C ++는 C보다 타이핑이 더 엄격합니다. C ++에서 C 코드를 컴파일하려면 예상되는 유형을 얻기 위해 다양한 유형 변환을 추가해야합니다. 즉, C ++에서 작동하려면 완벽하게 훌륭한 프로덕션 품질의 C 코드를 다시 작성해야 할 수도 있습니다.

  • 엄격한 타이핑으로 제공되는 타입 캐스트는 일반적으로 좋은 일이지만 경우에 따라 버그를 소개하거나 숨길 수 있습니다. malloc ()의 악명 높은 결과를 예로 들어 보겠습니다. 이것은 C ++로 타입 캐스팅되어야하지만 C에서는 절대로 캐스팅되지 않아야합니다. (1)

  • C와 C ++ 기능을 혼합하면 버그와 정의되지 않은 동작이 발생할 수 있습니다. 예를 들어, malloc ()으로 할당하고 delete로 해제하는 것은 작동하지 않습니다 . (2)

  • 나사산 안전 문제. C 표준 라이브러리는 스레드 안전하지 않습니다. 표준 C ++ 라이브러리는 스레드 안전 할 수도 있고 그렇지 않을 수도 있습니다. 그렇다면 C 라이브러리 함수 호출을 코드에 추가하면 파괴됩니다.

    Windows 프로그래머를위한 참고 사항 : Windows API CreateThread () 함수가 C 라이브러리와 동일한 프로그램에서 사용될 때 Visual C ++ 컴파일러에는 꽤 오랫동안 누출 버그가있었습니다. (3, 4)

  • 일부 컴파일러에서는 호출 규칙이 문제가 될 수 있으므로 extern "C""C 호출 규칙"과 링크되어야하는 함수를 명시 적으로 알려주는 데 사용해야합니다.

  • 성가신 세부 사항. 쉼표 연산자는 다르게 동작합니다. C99 / C11에서는 struct / enum 선언에서 후행 쉼표를 사용할 수 있지만 C ++은 사용할 수 없습니다. 다양한 종류의 변수와 함수의 범위는 다르게 취급됩니다. 등

더 많은 경우가 있습니다.


참고 문헌 :

  1. http://c-faq.com/malloc/cast.html
  2. http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.3
  3. http://www.flounder.com/badprogram.htm#CreateThread
  4. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682453%28v=vs.85%29.aspx

7

C ++가 C를 컴파일 할 수있는 이유는 "이전 버전 호환성"만을위한 것입니다 (기존 작업 코드를 다시 쓰지 않아야 함).

그러나 C ++은 c와는 다른 철학을 가지고 있습니다. 그것들을 혼합하면 둘 다에게 좋은 서비스를하지 않습니다.

C 및 C ++에서 i / o를 관리하는 방법은 다른 방법으로 i / o 내부 상태를 관리 할 수 ​​있습니다. 따라서 최소한 입력과 출력을 일관되게 사용하십시오.

그리고 C ++ 프로그램에서 C ++ 스타일을 존중합니다 (다른 곳에서 특별히 요구하지 않는 한)


5

저는 C를 먼저 배우는 것이 IMHO라고 생각합니다. 이런 방식으로 사람들은 소프트웨어를 작성하는 하드웨어를 이해하기 시작합니다.

이 두 언어를 혼합하는 것은 좋은 생각이 아닙니다. C에 공통적 인 raw bit twiddling과 결합 된 C ++의 엄청난 복잡성을 얻을 수 있기 때문입니다.

보시다시피, 간단한 예제에서도 다양한 유형의 스트림 및 내부 버퍼링과 관련된 동기화 문제가 있습니다. 또한 C & C ++ 접근 방식은 더 이상 유연하지 않습니다. 클래스 x로 전환하면 스트리밍 및 콘텐츠를 사용할 운영자가 없습니다.

복잡하다 ...

저는 훌륭한 C ++ 프로그래머가 비트가 모든 구문에서 어떻게 뒤집히는 지, 숨겨진 행동은 무엇인지 알아야한다고 생각합니다.

그러나 C ++을 배우는 데는 적어도 50 % 이상이 5 년 이상 전문적인 코딩이 필요하며 6 개월 정도의 커리큘럼에서는 20 시간 정도의 경험을 통해이를 관리 할 수 ​​없습니다.

C에서 C ++ 구문을 사용한다면 스트림을 사용하지 않을 것이며, 조감도에서 간단하게 볼 수 있으며 사람들이 소프트웨어 개발이 쉽다고 생각하지만 많은 상황에서 많은 이점을 얻지 않고도 추가 복잡성을 숨길 수 있습니다.

RAII 래퍼 클래스, 템플릿, 오버로드, const 정확성 및 공통 인터페이스에 대한 순수 추상 클래스 (여기서 f-ng Java 방식을 사용하지 마십시오!)가 좋은 후보입니다. 실제 프로젝트에 매우 중요한 안전성, 일반성 및 사용 편의성을 추가하기 때문입니다. 가상 파괴, 기본 복사본 구성의 폭발성, 런타임 오버 헤드, const 정확성 등의 사항도 기억하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.