2012-08-12 2 views
4

명시 적으로 포인터를 전달하여 C에서 에뮬레이트 할 수 있습니다. 가상 함수는 함수 포인터의 전역 배열에 대한 포인터를 모든 객체에 명시 적으로 저장하여 에뮬레이션 할 수 있습니다. 벌금.사람들이 실제로 C에서 OO를 수행합니까?

이제 내 질문은 사람들이 실제로 이렇게합니까? 실용적인 방법으로 사용되지 않는 C 신입생에게 무언가를 가르치고 싶지 않기 때문에이 기술을 가르치는 것이 가치가 있는지 궁금합니다.

(나는 OOP에 익숙한 사람들을위한 2 주간의 입문 C 코스의 마지막 날을 작성해야합니다.)

이 설명 된 방식으로 C에서 OO를 에뮬레이트 모든 관련 프로젝트, 라이브러리 나 프레임 워크가 있습니까 ?

+4

* * (* afaik)라고해도 C 코스에서 신입생이 필요합니까? – jalf

+0

@jalf 이해하기 어렵지 않습니다. 만약 누군가 C의 기초를 잘 이해한다면, 얼마 후 그는 이것을 우연히 발견하게 될 것입니다. 그리고 그는 그것을 이해할 것입니다. –

+0

나는 좋은 기사를 발견했다. http://www.planetpdf.com/codecuts/pdfs/ooc.pdf – tikhop

답변

1

실제로 사용할 수는 없지만 첫 번째 매개 변수로 개체를 가져 오는 멤버 함수와 함수 간의 동등성 개념을 이해하는 것은 매우 중요합니다. 그들의 머리 뒤쪽에이 개념을 갖는 것이 길 아래에서 마주 칠 많은 문제에서 그들을 도울 것입니다.

날이 맞지 않는 날 왜 함수 포인터가 필요한 항목에 멤버 함수를 전달하는지 가리키는 기능이없는 이유에 대해 스택 오버플로에 대한 질문을하는 사람들이 있습니다. 그들은 멤버 함수가 객체의 일부인 일부 마법 함수이고 전체 상황을 지나치게 복잡하게 만든다고 생각합니다.멤버 함수가 첫 번째 매개 변수로 객체를 가져온 함수와 동일하다는 것을 깨닫게되면 (즉, 메소드를 호출 할 때 발생하는 문제는 멤버 함수 포인터와 객체 모두 필요합니다.) 가능한 솔루션 (어떻게 든 별도로 객체를 전달하거나 객체를 캡처하는 일종의 폐쇄를 만들기)이 분명해진다. 분명히, 너무 많은 사람들이 OO가 "마법"이고 이것이 이것을 이해하지 못하는 것처럼 가장합니다.

함수 프로그래밍에서 우리는 데이터 구조와 로컬 변수와 그 모든 것들이 함수의 조작이라는 관점에서 어떻게 쓰여지는지 사람들에게 가르쳐주는 경우가 많습니다. 이것이 실용적이지는 않을 것입니다. 아마도 비효율적 일 것입니다.하지만 이것은 기능의 힘에 대해 뭔가를 느끼게합니다. 그리고 그것은 그들이 다른 방식으로 사물을 이해하는 데 도움이됩니다. 그리고 컴파일러 등을 작성하면 길을 잃을 수도 있습니다. 이러한 동등성이 도움이 될 것입니다.

컴퓨터 과학은 모두 등가성 및 감소에 관한 것이고, 또 다른 문제에 대해 어떻게 생각하는지에 관한 것입니다. 우리는 SAT-3를 부분 집합으로 줄입니다. 실제로 이것이 SAT-3 문제를 실제로 풀 것인가가 아니라 부분 집합 합이 NP 완전이라고 가르치기 때문입니다.

가끔씩 나는 인스턴스가 아닌 메소드가 인수로 구조체에 대한 포인터를 취하는 코드 조각을 보았습니다. 그리고 패턴을보고 전구가 내 몸을가립니다. 이 동등성에 대해 알고 있기 때문에 이것은 인스턴스 메소드로 다시 고려 될 수 있습니다. 따라서 이러한 동등성을 알면 더 나은 간단한 코드를 작성할 수 있습니다.

3

예. 그렇습니다.

설명 된 방식으로 C에서 OO를 에뮬레이션하는 관련 프로젝트, 라이브러리 또는 프레임 워크가 있습니까?

일급 언어 지원이 없기 때문에 "모방"이라고하지는 않습니다. GObject을 참조하십시오.

2

많은 프로젝트가 C 코드베이스에서 객체 지향 패러다임을 사용합니다. 다양한 이유로 CPP를 직접 사용하지 않습니다. 시스템 수준 또는 성능 집약적 인 프로젝트의 경우 다른 언어로도 거래가 중단되지 않습니다. 그래서 cpp와 c 사이의 전투.

왜 사람들은 완전히 날려 버린 CPP 대신 C에서 OO를 에뮬레이션합니까? Linus의 torvalds는 유명한 CPP 컴파일러는 신뢰할 수 없다고 말했습니다. 그는 CPP 생성 코드에 대한 믿음이 거의 없습니다. 이

part1

part2

:

리눅스 커널 당신은 리눅스 커널이 lwn.net 기사 시리즈에서 그것을 어떻게했는지에 대해 읽을 수 있습니다 C.에서 OO 디자인 패턴을 구현하는 좋은 예입니다 C에서 전체 범위 구현 OO 디자인 패턴을 다루는 인터넷에있는 광범위한 무료 문서입니다.

ooc.pdf

같은 도로를 따라 다른 많은 프로젝트를 찾을 수 있습니다.

예 :

pjsip

sofia

8

나는 C. 경험 내가 처음으로 배운 컴파일 언어 약 20 년이었다했고 나는 이동하는 데 필요한 적이없는, 그래서이다 C 였고 C 만있었습니다. 나는 직장과 가정에서 끊임없이 코드를 작성합니다. 나는 lock-free 데이터 구조의 라이브러리를 발표했다. 나는 유능한 C 프로그래머라고 생각한다.

질문과 관련하여 OO는 많은 개념으로 구성되어 있습니다. 예를 들어 인스턴스화는 new() 및 delete() 및 주어진 엔터티 (스택, 목록 등)의 인스턴스가있는 라이브러리입니다. C는이 기능을 지원하지만 물론 기능적이고 유용한 접근 방법입니다. 저는이 접근법을 약 15 년 동안 사용해 왔습니다.

몇 년 전에 저는 C++에서 잘 지원되는 다른 OO 개념을 실험하기 시작했습니다. 상속. 다른 엔티티가 포함 된 엔티티를 원했습니다. 그런 다음 문제는 포함 된 Entities의 API를 노출하는 것입니다. 당신은 그것을 할 수는 있지만 사실 C 언어는 자연스럽게 그러한 개념과 접근 방식을 표현하지 않습니다. 내가 지금 사용하는 것이 아닙니다.

제 조언은; 나이프는 칼, 포크는 포크입니다. 둘 중 하나를 다른 것으로 사용할 수는 있지만 잘 작동하지 않습니다. C는 상속과 같은 몇 가지 (중요한) OO 개념을 자연스럽게 지원하지 않습니다. C가 이런 일을하도록 만들지 마십시오. 이 작업을 수행하려면 C++을 사용하십시오.

0

TI의 "DSP Algorithm Standard"/ xDAIS 프레임 워크를 확인하십시오.

준수하는 모든 DSP 알고리즘 구현이 구현하는 일반적인 C API가 있습니다 (동어 반복을 위해 유감스러운).

  • 상대적으로 작은 램
  • 여러 개의 데이터 채널 (종종 병렬/동시)
  • 복잡한 알고리즘의 사용 패턴
  • 뭔가 : 모든이 "예술"에 대한 필요성은 DSP 세계에서 일반적인 몇 가지 문제에서 비롯된 그렇지 않으면 잊어 버린다.

표준 및 프레임 워크는 DSP 엔지니어가 타사 DSP 알고리즘을보다 쉽게 ​​사용하도록하기위한 것입니다.

알고리즘 인스턴스를 구성하고 메모리 요구 사항을 쿼리 (구성을 기반으로)하고 실제로 메모리를 관리하는 지원 기능이있는 인터페이스가 있습니다.

일부 메모리 영역 인 스크래치 패드는 일시적으로 할당되어 알고리즘 인스턴스가 활성 상태 일 때 알고리즘 인스턴스에 할당 될 수 있으며 비활성 상태이고 다른 인스턴스에 제공되면 효과적으로 공유됩니다.

메모리 조각 모음을 위해 인스턴스 메모리 버퍼를 이동하는 기능 (및 API)도 있습니다.

더 많은 내용이 있지만 자세한 내용을 보려면 문서를 다시 읽어야합니다.

예를 들어 IALG_*()ALG_*() 인터페이스 방법을 참조하십시오.

또한 일반 API의 구현을 확인하는 도구가 있습니다. 타사는 TI로부터 공식 검증을 요청할 수 있습니다.

일부 관련 링크 : spru352g.pdf, spru360e.pdf.

관련 문제