[완료]다른 라이브러리 헤더에서 선언한 타입을 typedef하여 사용하는 경우..

syrlove의 이미지

헤더파일 간의 의존성을 줄이기 위해
다른 라이브러리에서 선언된 타입을 다시 typedef하려고 합니다.
이것이 버전이나 기타 호환성에 어떤 영향을 줄지 고민해보다가 질문드립니다.

이를 테면, winsock2를 class화 시키는 헤더파일이 있을때..

class A
{
private:
SOCKET s;
public:
~
~
~
}

이런 식으로 있는 경우, 구지 winsock2.h를 include하기보다는 SOCKET타입만 알고 있으면 컴파일 되기 때문에,
class A
{
typedef __unsigned int SOCKET;
..
..
..
}

이런 식으로 선언해 놓고 쓰려고 하는데, 분명 파일 간의 의존도는 줄여주지만,
대상 라이브러리가 수정될 경우 문제를 일으킬 것이기 때문에,
이에 대해 어떻게 생각하시는 지 여러분의 의견을 듣고 싶어 질문드립니다.

많은 의견 부탁드릴께요..
감사합니다.

tifler의 이미지

a.h

class A {
  ...
};

b.h

//#include "a.h"
 
class A;
 
class B {
  ...
  A *a;
  ...
}

멤버를 포인터로 선언해 보세요. 쉽게 해결이 될 수 있습니다.

/***********************
* while(1) sleep(INFINITE);
***********************/

syrlove의 이미지

클래스의 경우엔 그렇게 하지만,
제가 드린 질문은 typedef의 경우입니다..

가령, 제가 만든 클래스의 멤버함수 중에, 윈도우API를 호출하는 함수가 있고,
때문에 이 멤버함수가 인자로 DWORD형을 받아야된다고 했을때,

헤더파일은 DWORD형 하나 때문에 windef.h 혹은 windows.h를 include 해야만 합니다.
저는 이렇게 include하는 것보다 DWORD의 원래 형을 그 헤더파일에서 찾아,
제 헤더파일에 typedef unsigned long DWORD 이런 식으로 정의해놓고 쓰려고 하는데,
이 경우, 만약 원본 파일의 타입이 변경될 경우 호환성을 갖을 수 없게 되지 않잖아요..

버전호환성을 잃더라도 이렇게 하는 것이 옳은 것인지, 아니면 비용을 치루더라도 해당 파일을 include하는 게 맞는 것인지,
여러분의 의견을 듣고 싶어 질문드렸습니다.. 질문 부탁드릴께요...

bushi의 이미지

그건 뭔가를 얻기 위한 '비용'이 아닙니다.
이미 얻어낸 '무엇'이죠.
더 싼 '비용'의 '무엇'인가는 없습니다.
얻어낼 수 있는 '무엇'을 포기하느냐 마느냐의 선택만 있을 뿐입니다.

OTL

syrlove의 이미지

무엇이 더 좋다기보단, 상황에 맞춰서 include를 사용할지,
typedef를 사용할지 선택해야된다는 말씀이신가요?

tifler의 이미지

의존성을 단순화 시키자고 기본 라이브러리의 설계 구조를 뒤흔드는건 더 큰 "비용"을 지불하는 꼴이 되지 않을까요? 언급 하셨듯이, typedef를 쓰는 이유에는 "그 형이 어떻게 변하더라도 호환성을 유지한다"라는 의미도 포함되는데, 이것을 임의로 변경하는 오류를 범해서는 안 될 것 같습니다.

/***********************
* while(1) sleep(INFINITE);
***********************/

syrlove의 이미지

다른 헤더파일에 typedef로 정의되어 있는 타입명을 class xxx;로 전방선언해놓고 사용해보았지만 잘 되질 않네요...
많은 의견 부탁드릴께요..

unipro의 이미지

class AImpl;
class A
{
private:
    AImpl *a;
}

class AImpl
{
// ....
}

이와 같이 선언하고, 실제 구현을 AImpl에서 상속받아서 하는 방법도 있습니다.

#include <winsock2.h>
#include "aimpl.h"
 
class AImplWin32 : public AImpl
{
private:
    SOCKET s;
}

----
내 블로그: http://unipro.tistory.com

내 블로그: http://unipro.tistory.com

syrlove의 이미지

저도 제 나름 고민해본 결과, 의존성을 줄이자고 호환성을 줄이는 것은 더 큰 비용이라고 결론내렸습니다.
여러 의견주신 것 감사합니다^^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.