원래 정석적인 C 스타일 자체가 OOP 랑 그렇게 다르지 않음 (밥 마틴도 한 얘기). C++ 이 C 에 비해서 가지는 가장 큰 장점은 템플릿이랑 오버로딩이라 생각함
커헠(msca8h)2020-03-23 20:33
답글
아 그리고 보통 바이너리 사이즈가 C가 훨씬 작음 - return 0;
커헠(msca8h)2020-03-23 20:41
커널같이 졸라 로우한거 아니면 의미없을듯
Adenosie(adenosie)2020-03-23 20:33
c 가 c++ 보다 장점인 점은 광범위한 호환성임. 그외 단순한 문법
익명(218.147)2020-03-23 20:40
답글
대부분의 시스템은 C ABI 를 지원하니 ㅇㅇ - return 0;
커헠(msca8h)2020-03-23 20:40
답글
C11은 호환성 광범위하다고 하기엔 뭐함
익명(121.132)2020-03-23 20:55
C 제네릭은 좀 해괴하기도 하고 업계에서 안씀 C99도 잘 안쓰는 판임
익명(121.132)2020-03-23 20:55
답글
c 제네릭이라는게 void * 을 말씀하시는거라면 실제로 업계에서 많이 쓰여요. 그 예로 dlopen 함수 포인터, 그리고 callback 에 인자가 void * 로 흔하죠. 그리고 void * 로 형을 지정하기 어려운 문제가 있다면... struct 에 type 라는 멤버를 두는 방법도 있네요. void * 로 넘겨주거나 받은 걸 struct 으로 캐스팅하고, var->type 로 타입을 체크하면 멀티 타입을 만들 수 있습니다.
익명(218.147)2020-03-23 21:09
답글
struct MultiType... 이런 구조체를 만들고, 구조체 멤버로 type 을 두고 type 가 INT, UINT, CHAR, STRING, OBJECT, OTHER_STRUCT 등으로 해놓고 if multi.type == MYTYPE ... ((MyType *) var) ... 이런 식으로 써먹을 수 있죠. oop 언어에서는 언어 자체에서 해주는데.. 타이핑하기 귀찮아서 그렇지 ㅋㅋ
익명(218.147)2020-03-23 21:12
답글
아뇨 void *라면 당연히 범용적으로 쓰이죠. C11 스펙에 있는 매크로 기반 제네릭을 말하는거 아녔나요? 제가 글 내용을 제대로 파악하지 못했다면 죄송합니다.
익명(121.132)2020-03-23 21:19
답글
그리고 개인적으로 타입을 모르는 모든 상황을 싸잡아 문제라고 생각하진 않지만 타입에 따라서 분기를 달리 타는 코드는 대부분의 상황에서 잘못 설계된 거라고 생각합니다.
익명(175.223)2020-03-23 21:23
답글
뭐...죄송까지야... 저도 동문서답한거는 아닌가.. 그 걱정하고 있었건걸요
익명(218.147)2020-03-23 21:23
답글
그래서 void *는 아주 조심스럽게 쓰라고 배웠습니다. 어떤 자료형이 들어올지 예측이 가능하면 모를까 type을 따로 저장하는건 특수한 상황을 제외한 대부분의 상황에서는 구조 자체가 잘못된 경우가 많습니다.
익명(175.223)2020-03-23 21:24
답글
대강 어떤 식의 코드를 말씀하시는지 알겠네요. 제가 예를 드는것은 분기라기보다... 타입 형변환입니다. 아주 흔해요. XEvent, GdkEvent
GdkEvent *event;
GdkEventType type;
type = event->type;
x = ((GdkEventButton*)event)->x;
XEvent 도 저런 식이에요. glib 에서 gpointer user_data 이런 인자가 흔하고 gpointer 이 void * 입니다.
익명(218.147)2020-03-23 21:28
답글
glib,gtk 프로그래밍 하면 g_signal_connect 필수적으로 사용하실텐데.. 그 매크로가 가리키는 함수 원형입니다. 거기 보이시는 gpointer 가 void * 입니다.
g_signal_connect_data (gpointer instance,
const gchar *detailed_signal,
GCallback c_handler,
gpointer data,
GClosureNotify destroy_data,
GConnectFlags connect_flags);
원래 정석적인 C 스타일 자체가 OOP 랑 그렇게 다르지 않음 (밥 마틴도 한 얘기). C++ 이 C 에 비해서 가지는 가장 큰 장점은 템플릿이랑 오버로딩이라 생각함
아 그리고 보통 바이너리 사이즈가 C가 훨씬 작음 - return 0;
커널같이 졸라 로우한거 아니면 의미없을듯
c 가 c++ 보다 장점인 점은 광범위한 호환성임. 그외 단순한 문법
대부분의 시스템은 C ABI 를 지원하니 ㅇㅇ - return 0;
C11은 호환성 광범위하다고 하기엔 뭐함
C 제네릭은 좀 해괴하기도 하고 업계에서 안씀 C99도 잘 안쓰는 판임
c 제네릭이라는게 void * 을 말씀하시는거라면 실제로 업계에서 많이 쓰여요. 그 예로 dlopen 함수 포인터, 그리고 callback 에 인자가 void * 로 흔하죠. 그리고 void * 로 형을 지정하기 어려운 문제가 있다면... struct 에 type 라는 멤버를 두는 방법도 있네요. void * 로 넘겨주거나 받은 걸 struct 으로 캐스팅하고, var->type 로 타입을 체크하면 멀티 타입을 만들 수 있습니다.
struct MultiType... 이런 구조체를 만들고, 구조체 멤버로 type 을 두고 type 가 INT, UINT, CHAR, STRING, OBJECT, OTHER_STRUCT 등으로 해놓고 if multi.type == MYTYPE ... ((MyType *) var) ... 이런 식으로 써먹을 수 있죠. oop 언어에서는 언어 자체에서 해주는데.. 타이핑하기 귀찮아서 그렇지 ㅋㅋ
아뇨 void *라면 당연히 범용적으로 쓰이죠. C11 스펙에 있는 매크로 기반 제네릭을 말하는거 아녔나요? 제가 글 내용을 제대로 파악하지 못했다면 죄송합니다.
그리고 개인적으로 타입을 모르는 모든 상황을 싸잡아 문제라고 생각하진 않지만 타입에 따라서 분기를 달리 타는 코드는 대부분의 상황에서 잘못 설계된 거라고 생각합니다.
뭐...죄송까지야... 저도 동문서답한거는 아닌가.. 그 걱정하고 있었건걸요
그래서 void *는 아주 조심스럽게 쓰라고 배웠습니다. 어떤 자료형이 들어올지 예측이 가능하면 모를까 type을 따로 저장하는건 특수한 상황을 제외한 대부분의 상황에서는 구조 자체가 잘못된 경우가 많습니다.
대강 어떤 식의 코드를 말씀하시는지 알겠네요. 제가 예를 드는것은 분기라기보다... 타입 형변환입니다. 아주 흔해요. XEvent, GdkEvent GdkEvent *event; GdkEventType type; type = event->type; x = ((GdkEventButton*)event)->x; XEvent 도 저런 식이에요. glib 에서 gpointer user_data 이런 인자가 흔하고 gpointer 이 void * 입니다.
glib,gtk 프로그래밍 하면 g_signal_connect 필수적으로 사용하실텐데.. 그 매크로가 가리키는 함수 원형입니다. 거기 보이시는 gpointer 가 void * 입니다. g_signal_connect_data (gpointer instance, const gchar *detailed_signal, GCallback c_handler, gpointer data, GClosureNotify destroy_data, GConnectFlags connect_flags);
그리고 리눅스 커널 소스에도 흔하죠 ㅋㅋ
그리고 아마 vulkan 에도 저런 식의 코드가 엄청나네요.
https://github.com/KhronosGroup/Vulkan-Headers/blob/master/include/vulkan/vulkan_core.h
좀 코어쪽이거나 규모가 대단히 큰 라이브러리나 체계에서는 필요하군요
218.147/ C 의 generic 은 void* 말고 _Generic 말하는겁니다 - return 0;
와... 저런 것도 있었구나.. 커헉님~~~~ 감사해욧!!
호환성이나 임베디드 아니고서야 전자로 쓸 이유가 있을까
마 고오급 언어 성능딸용 네이티브 인터페이스로 C쓰는거 모리나 갓-바에 C붙여쓰라 이말이야