C ++을 사용하지만 언어의 특정 기능을 사용하지 않는 경우 C로 전환해야합니까?


16

나는 자유 시간에 취미로 NES 에뮬레이터를 개발 중입니다. 나는 주로 사용하는 언어이기 때문에 C ++을 사용한다.

그러나 이제 프로젝트에 약간의 발전을 가졌으므로 C ++의 거의 모든 특정 기능을 사용하지 않으며 일반 C에서 동일한 결과를 얻을 수 있습니다. 템플릿, 연산자 오버로드, 다형성, 상속을 사용하지 않습니다. 그래서 뭐라고 하시겠습니까? C ++로 유지하거나 C로 다시 작성해야합니까?

나는 성능을 높이기 위해 이것을하지 않을 것이고 부작용으로 올 수 있지만 아이디어는 C ++을 필요로하지 않는 이유는 무엇입니까?

내가 사용하는 C ++의 유일한 기능은 데이터와 메소드를 캡슐화하는 클래스이지만 struct 및 함수와 함께 수행 할 수 있으며 new 및 delete를 사용하고 있지만 malloc과 free를 사용할 수는 있습니다. 함수에 대한 포인터로 달성 할 수있는 콜백에 대해서만 상속을 사용합니다.

그것은 취미 프로젝트이므로 마감일이 없으므로 다시 쓰기가 필요한 오버 헤드 시간과 작업은 문제가되지 않으며 재미있을 수도 있습니다. 그렇다면 질문은 C 또는 C ++입니까?


3
당신은 이미 자신에게 대답 한 것 같습니다 : C 만 필요하다면 왜 C ++을 사용합니까? C가 완벽하게 많은 상황이 있습니다.
Giorgio

3
@Giorgio : 60 초 후에 모두 증발하므로 코드를 유지해야합니다.
DeadMG December

7
I use C++ because is the language I use mostly, know mostly and like mostly.이것이 귀하의 질문에 대한 답변입니다. 현재 언어로 해결할 수없는 문제가있는 경우 프로젝트 중간에 언어를 전환해야합니다. I don't use templates, operator overloading, polymorphism, inheritance.C로 전환하는 것보다 개념을 배우고 사용하는 것이 훨씬 더 가치가 있습니다.이 프로젝트는 취미 프로젝트이므로 이전에 사용하지 않은 몇 가지를 사용하지 않는 이유는 무엇입니까? 항상 C로 다른 프로젝트를 시작하고 언어를 배울 수 있지만 현재 프로젝트에서는 전환하는 것이 합리적이지 않습니다.
yannis December

4
필자가 쓰는 모든 프로젝트에서 100 % 언어를 사용하지는 않습니다. 당신은 C ++을 가장 잘 알고 있으며, 이전에는 사용하지 못했던 기능을 사용해야 할 좋은 이유를 찾을 수 있습니다. 당신은 당신이 표준 라이브러리 물건을 사용하기 시작하고 부스트 구조물이 좋아하면, 훨씬 더 안전한 C로 C ++ 치료를 시작할 수 있습니다 std::shared_ptr, std::unique_ptr, boost::scoped_ptr, std::vector, std::deque, std::map,을, 콜백 함수의 등, 펑의 사용에보고하고, C ++ 11 람다 함수와 같은 것을 사용할 수도 있습니다.
wkl

3
@Giorgio : 예. 무한 링크 목록을 롤링하면 불필요한 오류가 발생합니다.
DeadMG

답변:


40

이제 그것을 사용하지 않는,하지만 다음에 당신은 메모리 누수가하거나 다시 와서 구걸 할 것이다, 이중 삭제를 얻을 std::vector<T>, std::unique_ptr<T, Del>그리고 std::shared_ptr<T>이러한 문제는 거의 하찮게 easily- 해결할 수있다. 이것이 C ++ 대신 C를 사용하는 모든 사람들에게 일어나는 일이며, 더 똑똑한 사람들은 버그가 나올 때까지 기다리지 않습니다.

코드가 사용 new하고 delete직접하지 않습니다 정말 C에서 + +, 우리가 "클래스와 C"로 참조하는 것이 반 집의 종류에 속한다 속한다. 1985 년 경에 언어가 사용 된 곳입니다. 2011 년경 C ++과 비슷하지는 않습니다. C ++을 배운 어느 곳에서나 C ++을 아주 잘 가르치지 못했을 것입니다. 이 기능의 사용을 찾으십시오.

특히 위에서 설명한 것처럼 C ++의 일반 데이터 구조와 리소스 관리 클래스는 기본적으로 C가 제공하는 것보다 훨씬 우수합니다. 동적으로 할당 된 배열을 원하면을 사용하십시오 std::vector<T>. 매우 일반적인 사용 사례입니다. 그것들을 사용하지 않는다면, 코드는 불필요하게 특히 리소스 관리와 관련된 오류의 위험이 큽니다. C ++는 C가 절대 만질 수없는 방식으로 안전과 재사용 코드를 보장 할 수 있습니다.

그러나 나는 당신도 너무 많이 기대하고 있다고 생각합니다. 라이브러리 소비자에게는 템플릿 및 연산자 오버로드 작성이 일반적이지 않습니다. 코드에서를 사용 하는 경우 템플릿을 작성std::vector<T> 하지 않아도됩니다 . 코드에서를 사용 하면 아무도 연산자를 과부하시키지 않습니다. 만에 그 일을 할 필요가 쓰기 와 -하지만 당신은 여전히 그들을 최대한 활용할 수 있습니다.std::string std::vector<T>std::string

다형성 / 상속도 특정 사용 사례 만 있습니다. 코드에서 템플릿을 작성하거나 가상 기능을 사용할 필요가없는 경우에는 필요하지 않으며 자체 템플릿을 작성할 필요가없는 프로그램이나 프로그램 세그먼트가 있습니다.

또한 C에서 C ++보다 성능이 향상되지 않습니다.


1
@Giorgio : make_shared존재 make_unique하며 동일한 작업을 수행 하는 간단한 템플릿을 작성할 수 있습니다 . 더 안전합니다.
DeadMG

4
좋은 대답입니다. 머리에 못을 박는 다. C ++은 항상 사용해야하는이 작은 라이브러리에 가장 유용합니다.
Andres Jaan Tack

2
@Giorgio : 여러 인수를 호출 할 때 예외가 발생하면 메모리 누수가 발생하고 make_shared더 효율적 이기 때문에 안전하지 않습니다 . 공장 기능 만 예외 안전을 보장 할 수 있습니다.
DeadMG

6
@ tp1 : WTF? 영어로 부탁합니다.
DeadMG

2
@Lohoris 상식에 대한 인용이 필요하지 않습니다. C는 어떤 식으로 C ++보다 성능이 좋습니까?
Chris는 Reinstate Monica가

7

C ++ 전용 기능을 사용하지 않더라도 C ++ 컴파일러는 엄격한 C ++ 유형 시스템으로 인해 C보다 더 많은 문제를 포착합니다.


6

나는 다른 방향에서 그것을 볼 것입니다. C로 코드를 다시 작성하여 무엇 을 얻을 수 있습니까? 순전히 취미적인 프로젝트 일지라도 그러한 재 작성과 관련된 비용이 있습니다. 다른 기회가 없다면 기회 비용이라고 할 것입니다. 즉, C로 다시 쓰는 데 시간을 낭비 하지 않으면 그 시간에 할 수 있었던 다른 일들 입니다.

결론 : C ++에 대한 액세스가 실제로 제한적이거나 존재하지 않는 일부 환경에서 코드가 실제로 사용될 가능성이 있다고 생각하지 않으면 무의미한 시간 낭비입니다. 적어도 내 경험상, 그것은 일반적으로 매우 빨리 넘어갑니다 .C 로 변환 해야 했던 C ++로 작성된 코드를 다시 생각 하면, 아주 약간의 경우에도 사소한 것이어야합니다. 처음에 깨달았 던 것보다 C ++에 더 많은 기능을 사용하고있었습니다. 전혀 유용하기를 희망하려면 C89 / 90을 대상으로해야합니다.이 경우 블록의 시작 부분에서 모든 변수를 실제로 정의하는 대신 정의해야하는 것과 같은 것들을 빠르게 상기시킵니다. 익숙한.

간단히 말해서, C로 다시 쓰는 것이 실질적인 이점을 제공 할 것이라고 확신하지 않는 한, 필연적으로 훨씬 더 좋은 일이 있습니다.


+1 얼마 전에 다른 C 프로젝트에 사용할 라이브러리를 작성해야했는데 C로 구현 한 것이 좋은 생각이라고 생각했습니다.
Chris는 Reinstate Monica가

1

더 일반적인 답변으로 :

더 독특한 기능 중 일부를 사용하고 있다고해서 C ++로 전환하지 마십시오. 언젠가는 이러한 기능이 필요할 수 있으며 C를 사용하기 때문에 머리를 두드리게됩니다.


1

취미 개발의 경우 일반 C로 다시 전환하는 것이 좋습니다. C 및 C와 유사한 언어는 작은 취미 개발 모듈에서 지원 될 가능성이 높습니다.

여기에 나오는 많은 답변이 전문 소프트웨어 유형에서 비롯된 것일 수 있습니다. 애호가는 지속적으로 또는 풀 타임으로 코딩하지 않을 것입니다. 따라서 1 년 동안 프로젝트를 테이블에 넣은 다음 코드가 녹슬었을 때 코드를 읽으려고 할 때 어떤 언어를 기억하거나 잊어 버릴 것인지 생각하십시오. 더 풍부한 기능 세트를 가진 C ++는 코딩 스타일에 따라 다시 확보하는 데 다소 시간이 걸릴 수 있습니다.


1

언어 별 기술 (C vs C ++)을 향상 시키거나 다른 프로그래밍 기술 (디자인, 문제 해결 등)을 개선하기 위해 프로젝트를 진행하고 있는지 여부를 알 수 없기 때문에 질문에 대답하기가 쉽지 않습니다.

"내가 사용하는 C ++의 유일한 기능은 데이터와 메소드를 캡슐화하는 클래스이지만 구조체와 함수로도 수행 할 수 있습니다." 사실이 아닙니다. structsC에서는 캡슐화를 지원하지 않으며 함수 (메서드)를 포함 할 수 없습니다. 적어도 함수 포인터와 같은 기술을 사용하지 않는 한. 또한 C의 함수는 오버로드 될 수 없기 때문에 약합니다.

"새롭고 삭제를 사용하고 있지만 malloc과 free를 사용할 수 있으며 콜백에만 상속을 사용하고 있습니다. 함수에 대한 포인터로 얻을 수 있습니다." deadmg 직접 사용, 언급 한 바와 같이 newdeleteC ++에서 권장되지 않습니다. 또한 OOP의 IMHO (및 GoF) 상속은 다형성이 필요한 경우에만 구성보다 선호되어야합니다. 그리고 함수에 대한 포인터를 사용하여 C에서 다형성 (늦게 바인딩)을 달성하는 것이 사소한 것이라고 생각하지 않습니다.

그 외에는 C ++이 C보다 "더 낫다"고 설득하려고하지 않을 것입니다. 왜냐하면 선호의 문제이기 때문에 항상 해결하려는 문제에 달려 있기 때문입니다 (NES 에뮬레이터 개발에 OOP 기능 사용은 좋은 아이디어).


1
structs실제로 C에서는 메소드를 캡슐화하는 데 사용될 수 있습니다. 단순히 함수 포인터의 구조체를 만들고 원하는 함수를 가리 키도록 초기화하십시오. lxr.linux.no/linux+v3.3/include/linux/fs.h#L1598 을 살펴보십시오 .
Robert Martin

맞습니다. 의견 주셔서 감사합니다, 나는 대답을 확장했습니다.
사키 스크

좋은. 하나 더 nit : C의 함수는 오버로드 될 있지만 (생각할 수는printf 있지만) 유형 검사를 잃습니다. 수용 가능한 선언의 유한 세트를 가질 수있는 방법은 없습니다. 1 (및 유형 확인) 또는 "많음"(개인 위험이 큰 모든 유형 확인을 잃음)입니다. C의 대부분의 경우와 마찬가지로 가능 하지만 종종 불편합니다.
Robert Martin

함수에 대한 포인터는 고급 C 기술입니까? 정말?
Donal Fellows

@DonalFellows 당신 말이 맞아, 나는 과장했다. 고급 제거 : :)
sakisk

0

나는 매우 초보자이므로 여기에 2 비트가옵니다.

Wibit.net에서 C와 C ++을 배우고 있는데 기본적인 비디오 튜토리얼이 있습니다. 광고가 아닌 '상황'에 대한 개요를 이해하는 데 도움이 될 수 있습니다.

나는 당신이 취미가 되었기 때문에 C로 변경하고 배우는 것이 좋습니다. 이것은 문제가 아니라 즐거움이 될 것입니다.

나는 더 많은 조언을한다. 두 언어로하세요. 찾아서 사용할 방법과 솔루션을 비교하십시오. 당신이 기대하는 것처럼 "쉬운"것이 아니라고 확신하지만 많은 것을 배울 것입니다!


1
대단히 감사하지만, 배우지 않고 이미 C와 C ++을 알고 있습니다.이 특정 프로젝트에 어떤 것을 사용할 것인지 묻고 있습니다.
Petruza

죄송합니다. 배울 시간입니다! = P
H_7

1
또한 비디오 자습서 대신 Kernigan과 Stroustrup의 책, 멋진 IDE (Visual Studio, Eclipse, Xcode)를 얻고 예제, 시행 착오를 코딩하고 stackoverflow를 사용하여 배우는 것이 좋습니다.
Petruza

-1

C ++ 대 C의 장단점은 다음과 같습니다.

  1. C로 이동하면 선택한 C ++ 하위 세트 내에서 유지하기가 쉬워집니다. 컴파일러는 외부로 갈 때 오류가 발생하기 때문입니다. 주요 문제점이 결정된 서브 세트 내에 머무르는 경우이 대안을 선택해야합니다. (왜 우리는 이것을 컴파일러 지원하지 않습니까?)
  2. 선택한 c ++ 기능 하위 집합 내에 머물러 있으면 다음은 코드를 손상시키는 잘못된 규칙을 제거하기 위해 하위 집합을 변경하는 것입니다. 이를 위해서는 전체 C ++을 사용해야합니다.
  3. "서브셋 내부에 머무르기"와 "좋은 서브 세트"가되면 c ++ 기능에서 벗어나 요구 사항에 대해 생각하기 시작합니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.