typedef 로 선언한걸 갑자기 인식을 못하네요...T.T

kkojiband의 이미지

이런 경우는 처음이라...무지 당황스럽네요...--;

저는 구조체 선언할 때,

typedef struct _myStruct MyStruct;

struct _myStruct
{
...
};

이런 식으로 해서 사용을 합니다...

지금 한 달 넘게 만들고 있던 os 가 잘되다가 어제부터 구조체들을 해석을 못하면서 컴파일이 안됩니다...T.T

어떤 한 구조체를 추가시키고 난 뒤부터 이렇게 됐는데 그 구조체 뿐만 아니라 예전에 선언해놓은 구조체들까지 모두 parse error 가 떠버립니다...

하루 종일 코드를 뚫어지게 봤는데, 이유를 모르겠습니다...

선언이 틀린 것도 아니고, include 도 빠짐없이 다해줬고...

잘 되던것도 갑자기 안되니 무척 당황스럽네요...T.T

이게 대체 왜 이럴까요?? 도와주세요~ T.T

kkojiband의 이미지

어제부터 한 작업들을 모두 삭제하니 실행이 되긴 되네요...

실행이 되는 상태에서 제가 추가시킨건 간단한 코드들이고 에러를 발생시킬 소지도 거의(!) 없는데,

왜 선언된 구조체들이 pare error 를 발생시킬까요?

으악~ 돌아버리게따~~~!!!

도와주세요...T.T

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

moonzoo의 이미지

Quote:
저는 구조체 선언할 때,

typedef struct _myStruct MyStruct;

struct _myStruct
{
...
};

이런 식으로 해서 사용을 합니다...

한가지 분명한 사실은 위와 같이 선언한 것에 전혀 문제가 없다는

것입니다.

그러니 typedef의 문제로 생각치 마시고 다른 방향으로 생각해 보시기

바랍니다..

추가한 구조체의 선언등에 문제가 있는 것 같습니다.

보통 새로 추가한 것 때문에 다른 구조체의 선언등에도

parse error 가 발생했다면

; 를 안넣었다던지 하는 등의 문법 에러 가능성이 높다고 생각됩니다.

김충길의 이미지

프리프로세싱만 한 결과를 보시면 도움이 될듯..

소스는 변함이 없더라도 환경이 바뀌면 뭔가 상수들이 붙는게
안붙을 수 있거든요.

프리프로세싱만 한 결과에서 저 정의문 전후로 보심이..

screen + vim + ctags 좋아요~

kkojiband의 이미지

프리프로세싱만 해서 살펴본 결과 원인은 알았습니다...

예를 들어,

milk.h 가 sugar.h 에 선언되어있는 구조체를 참고하고,

sugar.h 또한 milk.h 에 선언되어있는 구조체를 참고한다면,

위 두 헤더 파일을 포함하는 main.c 를 프리프로세싱해보면 먼저 읽혀진 헤더 파일에서 parse error 가 발생을 합니다...

위 문제를 간단히 해결하려면 구조체들을 한 파일에 모아서 하면 되긴 될텐데, 그렇게 되면 파일들이 막 꼬여버리고...

음...해결 방법이 없을까요?

다른 분들도 프로젝트 하시다보면 이런 경우가 생기실꺼같은데 어떻게 해결하셨는지요??

조언 좀 부탁드립니다~!

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

lu4moon의 이미지

#ifndef ___somthing___
#define ___somthing___

typedef ...

struct ...
{..};

#endif

이런것 때문은 아닌가요?

parse error라면 아니겠지만 혹시나 해서요
양쪽파일에서 서로 include하고있다면 그런일이 없을것같기도하네요

You wrote 'fool self' magic on your book.

kkojiband의 이미지

헤더 파일은 위의 님 말씀대로 선언해서 사용하구 있구요,

저도 그렇게만 하면 다 될지 알았는데요...^^;

안되는 경우가 있더라구요...

예를 들어,

aaa.h

#ifndef __AAA_H__
#define __AAA_H__

#include "bbb.h"

typedef struct _aaa   Aaa;

struct _aaa
{
        Bbb *    b;
};

#endif

bbb.h

#ifndef __BBB_H__
#define __BBB_H__

#include "aaa.h"

typedef struct _bbb   Bbb;

struct _bbb
{
        Aaa *     a;
};

#endif

main.c

#include "aaa.h"

...

이렇게 한 뒤에 컴파일을 하면은, bbb.h 의 Aaa 부분에서 parse error 가 일어납니다...이유는,

main.c 에서 aaa.h 읽어들이고 aaa.h 에서 bbb.h 읽어들이고, bbb.h 에서 읽어들인 aaa.h 는 __AAA_H__ 가 define 되었기 때문에 넘어가고, 그래서 Aaa 를 해석을 못하는것 같습니다...

일단 제가 생각해본 해결책은,

typedef 로 선언한 부분들만 따로 모아서 무엇보다 먼저 선언을 해놓는 겁니다...이렇게하면 실행이 되긴 되더군요...--;

하지만 방법이 너무 허접하고...

다른 방법은...설계할때부터 저런 상황을 고려해서...? 음...--;

휘유...늘 사용하면서도 저런 상황에 대해선 꿈에도 생각도 못하고 있었네요...

허접함이 여실히 드러나는...T.T

이 문제를 어떻게 해야할까요? T.T

이제 졸업이다...사랑하는 SKKULUG 후배들아 안녕~

goodfiend의 이미지

Quote:

일단 제가 생각해본 해결책은,

typedef 로 선언한 부분들만 따로 모아서 무엇보다 먼저 선언을 해놓는 겁니다...이렇게하면 실행이 되긴 되더군요...--;

aaa.h

#ifndef __AAA_H__
#define __AAA_H__
                                                                                
typedef struct _aaa   Aaa;
                                                                                
#include "bbb.h"
                                                                                
                                                                                
struct _aaa
{
        Bbb *    b;
};
                                                                                
#endif

bbb.h

#ifndef __BBB_H__
#define __BBB_H__
                                                                                
typedef struct _bbb   Bbb;
                                                                                
#include "aaa.h"
                                                                                
                                                                                
struct _bbb
{
        Aaa *     a;
};
                                                                                
#endif                                                                            

이렇게 해서 다른곳에서 aaa.h를 include한다면 preprocessor에 의해 다음과 같은 알맞은 코드가 생겨나겠죠?

typedef struct _aaa   Aaa;
typedef struct _bbb   Bbb;

struct _bbb
{
        Aaa *     a;
};

struct _aaa
{
        Bbb *    b;
};

그러고 보니 preprocessor에 의해 생겨난 코드는 씨언어를 처음에 배울때 봤던 코드와 비슷한거 같네요..

두개의 함수가 서로를 재귀적으로 호출하며 정의하는... 선언문과 정의문을 구별하여 정의하면서 그 위에 선언문만 써주면 된다고...

sunyzero의 이미지

이런 경우를 cross reference 라고 하는데 원래 코드개발시에 서로 다른 두개의 헤더가 동등한 레벨에서 include 되는 것은 방지하는게 좋습니다. 위와 같이 프로그래밍 하는 것은 자칫하면 좋지 않은 프로그래밍 습관을 기를 수 있습니다.

두개의 헤더를 합치는게 좋지만, 제 생각에는 struct 구조 설계가 잘못된거 같습니다. 서로 참조가 가능한 구조체는 원래 만들지 않습니다. 공통의 규격을 따로 빼서 C 라는 녀석으로 만들고 이 녀석을 넣는 것으로 만드는게 좋습니다.

========================================
* The truth will set you free.

체스맨의 이미지

kkojiband wrote:

이렇게 한 뒤에 컴파일을 하면은, bbb.h 의 Aaa 부분에서 parse error 가 일어납니다...

이 해결은 아주 간단합니다. 선언부에서는 typedef 심볼을 안쓰면 되죠.

struct _aaa 
{ 
        struct _bbb *    b; 
};
struct _bbb 
{ 
        struct _aaa *     a; 
}; 

typedef struct _aaa   Aaa; 
typedef struct _bbb   Bbb; 

이렇게 하면 인클루드에 전혀 문제를 겪지 않습니다. 단지 struct 이름과 typedef 이름이 서로 대응되는 일관된 규칙만 가지면 되죠.

sunyzero wrote:

두개의 헤더를 합치는게 좋지만, 제 생각에는 struct 구조 설계가 잘못된거 같습니다. 서로 참조가 가능한 구조체는 원래 만들지 않습니다.

원래 만들지 않는다는 말씀에는 문제가 있습니다. 3차원 입체를 컴퓨터상에서 구현하는 솔리드 모델 자료 구조중 매우 유명한 Half-edge 자료 구조 및 Radial edge 자료 구조는 cross reference 를 매우 빈번히 사용합니다.

Orion Project : http://orionids.org

sunyzero의 이미지

cross-reference를 종종 사용한다는 것은 좀 납득이 안갑니다. 어떤 자료구조라고 하더라고 cross-reference가 발생할 경우에는 중복되는 부분을 제거하고 따로 만들어서 사용이 가능합니다.

만일 헤더파일을 위와 같이 cross-reference 하게 만드는 작업은 헤더안에서의 cross-reference 삽입위치에 따라서 컴파일러 에러를 만들수 있으므로 사용하지 않기를 권장하는 행위입니다. 또한 각 컴파일러 벤더마다 위치에 아주 민감한 녀석도 있습니다. 예를 들어 workshop c 에서는 typedef 을 할때도 struct가 미리 지정되지 않으면 에러가 나는 경우도 있습니다.

만일 half-edge 에서 이런 구조를 종종 사용한다면 뭔가 필연적인 방법이 있지 않고서는 납득되지 않는군요. cross-reference 를 사용하는 경우에는 신중한 프로그래밍을 해야 하므로 자료구조상으로는 그렇게 좋다고 볼 수 없습니다. 일반적으로는 말입니다.

========================================
* The truth will set you free.

catzbi의 이미지

typedef struct blah { 
  ... // 
}tagBlah,*ptr_tagBlah,**pptr_tagBlah;

이렇게 하면 좀 편하게 보입니다.

//template < class ST  > // template and typedef is not collateral in applying 
typedef struct blah { 
  int	a; 
  template < class ST > 

     ST*	  wrapped_Instance() { 
	
                ST* p_ST = new p_ST ;
	return   p_ST; 
  }
  virtual test(){
	  cout << " haha" <<endl; 
  }
}tagBlah,*ptr_tagBlah,**pptr_tagBlah, aTen_tagBlah[10];

<주의: template function 맞는지. 저런식으로 되는 게 gcc 3.2 에서

가능할지 모르겠습니다. 저는 않되는데 .

저런식이라면 어차게 되지않을런지요. 저건 :oops:

class 와 namespace 를 가지고 구역을 나눠주시면 코드가 날려있어도

어느정도 헤더 충돌이나 뭐나 괜찮을것 같군용..

class CA; // forward declaration

typdef struct tag; // 이렇게 하는거도 좋지만,...

체스맨의 이미지

sunyzero wrote:
어떤 자료구조라고 하더라고 cross-reference가 발생할 경우에는 중복되는 부분을 제거하고 따로 만들어서 사용이 가능합니다.

예 물론 다른 형식의 자료 구조로 전환할 수 있습니다. 하지만, 때로는 그것에 의해 탐색이 발생하기도 합니다. 예를 들어, gtk 나 mfc 같은 경우, 윈도우에 부가적인 데이터를 부여하기 위해 윈도 포인터를 키로, 해쉬(탐색)를 이용합니다.

하나의 실제 예로, 할당된 어떤 개체 A와 특정 시스템상의 윈도우를 cross reference 하는 경우인데, A 개체가 소멸될 때 윈도우도 소멸되게 하는 경우가 있었습니다. 이 때, 두가지 상황이 있는데
1. 윈도우를 사용자가 닫을 때 : 윈도우에서 A 개체 제거
2. A 를 제거하는 함수 호출 : A 에서 윈도우 제거
이런 경우는 탐색보다는 cross reference 가 대안이라 생각합니다.

솔리드 모델 halfedge 자료 구조에 대해서는 일단, 그 자료 구조가 나온 배경부터 설명이 되어야 하므로, 생략하겠습니다. 단, 그 자료 구조는 현재 사용되는 상용 CAD 프로그램에서 솔리드 모델링 기능을 구현하는데 가장 기본이 되어온 자료 구조 입니다. 이 자료구조에서 cross reference 는 성능을 위해 필연적입니다.

sunyzero wrote:
만일 헤더파일을 위와 같이 cross-reference 하게 만드는 작업은 헤더안에서의 cross-reference 삽입위치에 따라서 컴파일러 에러를 만들수 있으므로 사용하지 않기를 권장하는 행위입니다. 또한 각 컴파일러 벤더마다 위치에 아주 민감한 녀석도 있습니다. 예를 들어 workshop c 에서는 typedef 을 할때도 struct가 미리 지정되지 않으면 에러가 나는 경우도 있습니다.

제가 위에 적어놓은 예대로 하면 문제가 없습니다. struct 이름으로 cross reference 하고, typedef 는 struct 가 나온 다음에 하는거죠.

sunyzero wrote:
cross-reference 를 사용하는 경우에는 신중한 프로그래밍을 해야 하므로 자료구조상으로는 그렇게 좋다고 볼 수 없습니다. 일반적으로는 말입니다.

예, 일반적으로는 cross-reference 는 되도록 피하는 게 좋다는 것에는 저도 동의합니다. 어줍잖게 코딩하면 길잃은 포인터를 양산할 수 있으니까요. '원래 만들지 않는다'고 하셔서 필연적으로 사용하는 경우도 있다는 것을 말씀드린 겁니다.

Orion Project : http://orionids.org

sunyzero의 이미지

체스맨 wrote:
예 물론 다른 형식의 자료 구조로 전환할 수 있습니다. 하지만, 때로는 그것에 의해 탐색이 발생하기도 합니다. 예를 들어, gtk 나 mfc 같은 경우, 윈도우에 부가적인 데이터를 부여하기 위해 윈도 포인터를 키로, 해쉬(탐색)를 이용합니다.

하나의 실제 예로, 할당된 어떤 개체 A와 특정 시스템상의 윈도우를 cross reference 하는 경우인데, A 개체가 소멸될 때 윈도우도 소멸되게 하는 경우가 있었습니다. 이 때, 두가지 상황이 있는데
1. 윈도우를 사용자가 닫을 때 : 윈도우에서 A 개체 제거
2. A 를 제거하는 함수 호출 : A 에서 윈도우 제거
이런 경우는 탐색보다는 cross reference 가 대안이라 생각합니다.

위의 경우는 크로스 레퍼런스의 예가 아닌듯 하군요. 크로스 레퍼런스는 header include에서 발생하는 문제(컴파일타임)이지 런타임시에 고려되는 것은 아닙니다. 탐색하고 그런것과도 전혀 다른 이유죠. 위의 것은 그냥 어떤 데이터구조체(혹은 클래스)에 탐색을 피하기 위해서 tail pointer나 key mark 를 달아주는 것에 대한 예이군요.

그리고 어쩔 수 없는 경우에는 사용해야 하는 것에는 이의가 없습니다. 어쩔 수 없다는데 당연히 사용해야겠죠. 되도록이면 필수적이지 않으면 피하는게 좋을 뿐이죠. 정 안되면 하나의 헤더파일로 만들어서 서로가 서로를 include하는 것을 막아주면 되겠죠. 위에 말씀하신대로요.

========================================
* The truth will set you free.

체스맨의 이미지

sunyzero wrote:
위의 경우는 크로스 레퍼런스의 예가 아닌듯 하군요. 크로스 레퍼런스는 header include에서 발생하는 문제(컴파일타임)이지 런타임시에 고려되는 것은 아닙니다. 탐색하고 그런것과도 전혀 다른 이유죠. 위의 것은 그냥 어떤 데이터구조체(혹은 클래스)에 탐색을 피하기 위해서 tail pointer나 key mark 를 달아주는 것에 대한 예이군요.

그리고보니, 예제가 이 스레드와 핀트를 벗어났네요. 8)
하지만, 크로스레퍼런스의 의미상, 크로스 레퍼런스 된 것은 맞습니다.
꼭 지금과 같은 C header 파일상에서 나타나는 문제를 크로스레퍼런스라고 하는 것은 아니니까요.

참고로, halfedge 자료구조입니다.
아까 회사에서 halfedge 자료 구조 원형이 잘 검색이 안돼서 올리지
못했었습니다.

struct _solid {
  struct _solid* next, * prev;
  struct _face*   face;   /* face list header */
  struct _edge*   edge;   /* edge list header */
  struct _vertex* vertex; /* vertex list header */
  int             index;
};

struct _face {
  struct _face* next, * prev;
  struct _solid* solid;  /* solid cross reference */
  struct _loop* loop;    /* loop list header */
  struct _loop* oloop;   /* outer loop */
  double plane[4];       /* plane equation */
  int    index;
};

struct _loop {
  struct _loop* next, * prev;
  struct _face* face;   /* face cross reference */
  struct _halfedge* he; /* halfedge pointer */
};

struct _edge {
  struct _edge* next, * prev;
  struct _halfedge* he1;   /* right halfedge */
  struct _halfedge* he2;   /* left halfedge */
};

struct _halfedge {
  struct _halfedge* next, * prev;
  struct _edge*   edge;   /* edge cross reference */
  struct _vertex* vertex; /* vertex cross reference */
  struct _loop*   loop;   /* loop cross reference */
};

struct _vertex {
  struct _vertex* next, * prev;
  struct _halfedge* he; /* halfedge cross reference */
  double coord[3];      /* vertex coordinates */
  int    index;         /* vertex index */
};

typedef struct _solid SOLID;
typedef struct _face FACE;
typedef struct _loop LOOP;
typedef struct _edge EDGE;
typedef struct _halfedge HALFEDGE;
typedef struct _vertex VERTEX;

Orion Project : http://orionids.org

sunyzero의 이미지

자료구조상에서 역참조탐색을 피하기 위해서 사용하는 부분이군요.

halfedge는 모르겠지만, graph이론에서 주로 사용하는 코딩스타일이군요. CAD에서 사용한다니까, 아마도 면적이나 그런것들과 관계가 있나보군요..

그러고 보니 정말 원 쓰레드와 많이 벗어나는것 같군요. 8)

========================================
* The truth will set you free.

cdpark의 이미지

이런 경우 aaa.h와 bbb.h를 따로 가지고 있어봤자 유지보수에 전혀 도움이 안 됩니다. 컴파일 할 때에도 어짜피 둘 다 불러야 하니 이득도 없고요. 각 소스에서는 #include "aaa.h"와 #include "bbb.h"가 다 나타나야 합니다. 그냥 한 헤더파일로 합치는게 어떨까요? 서로의 구현을 blackbox로 몰라도 되는 상황이 아니니깐요.

lsj0713의 이미지

원래의 쓰레드와는 다소 어긋난 얘기지만, 몇가지 사항에 대해 지적하고자 합니다.

sunyzero wrote:
cross-reference를 종종 사용한다는 것은 좀 납득이 안갑니다. 어떤 자료구조라고 하더라고 cross-reference가 발생할 경우에는 중복되는 부분을 제거하고 따로 만들어서 사용이 가능합니다.

cross-refference가 정확히 무슨 뜻인지는 모르겠지만, 헤더 파일끼리의 상호 참조만을 뜻하는 것이라면 맞는 말입니다. 그러나 상호 참조 구조체를 뜻하는 것이라면 틀린 말입니다. 또한 상호 참조 구조체는 여러 곳에서 상당히 빈번하게 사용되고 있습니다.

struct foo { int data1; struct bar *next1; };
struct bar { int data2; struct foo *next2; };

위의 코드는 분명히 적법한 코드입니다. (C언어 펀더멘탈 p.608 인용)

sunyzero wrote:

예를 들어 workshop c 에서는 typedef 을 할때도 struct가 미리 지정되지 않으면 에러가 나는 경우도 있습니다.

하지만 그런 것이 표준(C90+AMD1을 기준으로)에 위배되는 코드는 아닙니다. 다음의 코드는 분명히 적법한 코드입니다. (C언어 펀더멘탈 p.605 인용)

typedef struct foo user_type;    /* incomplete type */
/* ... */
struct foo {
/* 맴버 선언 생략 */
};    /* completed */

만약 위의 코드가 제대로 컴파일이 안된다면, 해당 컴파일러의 버그이거나 ANSI C(혹은 ISO C) 표준을 제대로 지원하지 못하는 오래된 컴파일러일 가능성이 큽니다.

kkojiband wrote:

aaa.h 

#ifndef __AAA_H__ 
#define __AAA_H__ 

#include "bbb.h" 

typedef struct _aaa   Aaa; 

struct _aaa 
{ 
        Bbb *    b; 
}; 

#endif 

_와 그 뒤의 대문자로 시작하는 명칭 또는 __로 시작하는 명칭은 모두 구현체에 예약되어 있는 명칭입니다. (C99 7.1.3p1) 따라서 충돌 가능성이 있으며, 사용자는 일반적으로 사용하지 않는 것이 원칙입니다. 저같은 경우 macro guard용 매크로 상수 이름으로는 plsj_AAA_h와 같은 형식을 사용합니다. Visual C++에서 자동으로 생성한 코드에는 macro guard로 __AAA_H__와 같은 이름을 사용하는 것 같은데, 별로 바람직한 방식은 아닙니다.

sunyzero의 이미지

단순 cross-reference 란 의미를 좀더 명확히 하면 cross-reference header includsion 입니다. a란 헤더가 b를 부르고 , b가 a를 부르는 구조를 막기 위해서 만일 상호 참조 구조체가 종종 발생하면 앞서 말했듯이 하나의 header로 만드는게 원칙이란 뜻입니다.

그리고 cross-reference를 사용하는것은 원래 문법에는 맞지만 그다지 사용을 종용하는 기법은 아니라는 것입니다. 유지보수나 프로그램구조에 효율적이지 못하죠.

좋은 코드는 성능뿐 아니라 가독성도 뛰어나야 합니다.

PS) 아 그리고 위에서는 cross-reference inclusion으로 시작했다가, 나중에는 cross-reference struct definition에 관련된 이야기로 원래 쓰레드에서 조금 벗어나버렸습니다. 아 이야기를 하다보니 꼬이네요.

========================================
* The truth will set you free.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.