진짜 기초적인 C 질문좀 드리겠습니다 ㅠ
글쓴이: sacredone / 작성시간: 금, 2012/11/16 - 11:19오전
에휴...
아직까지 기초적인거나 물어보는제가 한심하지만;;
기초가 탄탄하지 않나봅니다 ㅠㅠ
먼저 제가 지금까지 쓰던 구조체 정의와 선언에 대해서 말씀드리면
typedef struct 아무이름{ 멤버 1; 멤버 2; }test_t; int main() { test_t t1; }
이렇게 정의하고 선언해서 사용했습니다
이렇게 쓰면서 제가 이해하기로는
"아무이름은 사실 의미없는거고 컴파일러에 따라 없으면 경고할수도있기 때문에 사용하고
실제로 나는 test_t 라는 이름으로 사용한다"
라고 생각하고 썼었는데
오늘 선배한테 듣기로 구조체 정의할때 이러더라구요
"구조체 사용할때 typedef 사용하던대로 사용해도되지만 별로 추천하지 않는다
나는 개인적으로 typedef 해서 사용하면 이게 실제하는건지 정의한건지 헷갈려서
어차피 한번 선언할거 그냥 struct ~ 쓴다. 이렇게되있으면 그냥 위에서 확인하면 되기때문에"
이러더라구요
전 이렇게 헷갈릴까봐 typedef 하고 타입이름을 test_t 처럼 언더바 t를 붙이는데
들어보니 struct 도 쓰는것도 나쁘지않을거같더라구요 typedef 안하고...
그래서 한번 그런스타일로 짜보려고했는데 궁금한점이 생겼습니다
typedef struct 아무이름 {
}test_t;
하면 [struct 아무이름 변수이름;] 으로 선언할꺼 [test_t 변수이름;] 이렇게 선언할수 있게되는건데
typdef 빼고
struct 아무이름 {
}test_t;
하면 struct 아무이름 변수이름; 으로 변수가 선언되고 test_t 는 어떻게되는건가요?
Forums:
기초가 탄탄하지 않다면 문법서를 다시 보시는 걸 추천합니다.
저는 이렇게 생각했습니다.
즉 typedef struct {} ~~~~ 여기서
즉 typedef struct {} ~~~~
여기서 물결에 들어갈것은 재정의 하는것이고
struct {} ~~~~
여기서 물결에 들어가는것은 실제로 변수를 선언하는 것인가요?
그렇게 되지요.
위에 달린 답글을 편집하려하였으나... 막혔네요. ㅎㅎ
내용이 추가된 코드입니다.
저는 이렇게 생각했습니다.
지나가다..
c가발목잡는다면 다른것을 하는게 더 낫습니다.
--------------------------------------------------------------------------------
open source, open teaching, 천기누설이 꿈~ 은 개뿔...
--------------------------------------------------------------------------------
어떻게 이런 쓰레기만도 못한 사상을 가지고 계신지
어떻게 이런 쓰레기만도 못한 사상을 가지고 계신지 궁금할 따름입니다.
이런 댓글에 아무 답글도 달리지 않는 걸 보면 KLDP도 이젠 너무 무심해진 걸까요.
그보다는 Don't feed this troll
그보다는 Don't feed this troll 원칙이 잘 지켜지고 있다고 생각합니다.
피할 수 있을때 즐겨라! http://melotopia.net/b
>> "구조체 사용할때 typedef 사용하던대로
>> "구조체 사용할때 typedef 사용하던대로 사용해도되지만 별로 추천하지 않는다 나는 개인적으로 typedef 해서 사용하면 이게 실제하는건지 정의한건지 헷갈려서 어차피 한번 선언할거 그냥 struct ~ 쓴다. 이렇게되있으면 그냥 위에서 확인하면 되기때문에"
그 선배 말은 그냥 무시하세요. 말씀하신 형태로 typedef를 사용하는 것은 널리 쓰이고 있고 별 단점도 없습니다
다들. 선언과 정의가 반대예요
많은 사이트들이 이상한 내용인데요.
책에 제대로 된 내용이 있습니다.
http://bestheroz.blog.me/89563691
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=70278966&qb=dHlwZWRlZiDsgqzsmqntlZjrjZjrjIDroZw=&enc=utf8§ion=kin&rank=3&search_sort=0&spq=0&pid=R6UF3U5Y7uwssa0aMXwssssssul-407300&sid=UKXn3XJvLCwAAF0FJmA
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
변수의 선언과 구조체의 선언은 다른 것인지요?
int형 변수의 경우는 int num;이라고 하면 "num 변수를 선언한다"라고 표현해야 하는 줄로 알고 있습니다.
그래서 struct 키워드를 이용해 만든 구조체의 경우에도 변수로 만든다고 하면 "선언한다"가 맞고
구조체의 모양을 결정하는 것은 선언과는 다른 것이니 정의가 적당하다고 생각하고 있었는데요.
"구조체의 선언"과 "구조체 변수의 선언"의 차이를 말씀하시는지요?
답변 감사합니다.
저는 이렇게 생각했습니다.
선언이라는 점에서 동일하나 형태가 다릅니다.
짧은 지식으로 대신 답글을 달아봅니다.
C언어에서의 선언이란 컴파일러에게 해당 명칭을 사용하겠다고 알려주는 것이 목적입니다. 즉, 메모리의 실체를 동반하지 않습니다. 또한 C언어에서 정의라는 것은 일반적인 "구조체의 모양을 정의하다"라고 할 때의 그 정의를 의미하는 것이 아니라 공간확보(메모리 할당 같은)와 메모리 상에 내용을 채워 넣넣는 것을 의미하는 것으로 알고 있습니다.
많은 경우 (가장 흔한 auto 형태의 변수 선언) 선언과 정의가 동시에 일어날 수 있습니다.
말씀하신바와 같이 int num; 이라는 변수 선언은 컴파일러에게 num이라는 이름을 사용하겠다고 알리며, 별도의 정의 과정 없이 컴파일러는 해당 명칭에 대하여
num이라는 이름에 대한 어떤 주소값을 할당하고 num에 값을 넣는 것이 가능하도록 합니다.
일반적인 변수 선언에서 선언과 정의가 분리되는 경우의 간단한 예는 extern을 사용하는 경우입니다.
A.c라는 파일에서 int num;을 전역으로 선언하고, B.c에서 extern int num;을 이용하는 경우 A.c에서는 int num;을 선언하면서 정의(메모리 공간 확보)가 일어났으나 B.c에서는 num이라는 이름을 사용하겠다고 알리기만 할 뿐 메모리 할당은 A.c 에서 발생한 것을 그대로 공유하여 사용합니다. 즉, 정의는 별도로 일어나지 않습니다.
struct의 경우도 위의 int로 예를 든것과 마찬가지입니다. 대부분의 경우 흔히 우리가 변수를 선언한다 라고 말하는 것들에서 선언과 정의가 동시에 발생하는 것이며,
말씀하신 struct의 모양을 정의하는 것 역시 그런 모양을 사용하겠다고 컴파일러에게 알리는 작업이므로 이 또한 struct 태그 선언이라고 말합니다.
답변 감사합니다.
잘못 알고 있던 것을 고쳐가네요.
감사합니다. ㅎㅎ
저는 이렇게 생각했습니다.
지금 책이 없어서 100% 정확한 내용은
지금 책이 없어서 100% 정확한 내용은 아니지만,
점점 결론이 잘못된 방향으로 가는 것 같아서 답글 붙여봅니다.
일단 웹상에서 찾은 선언/정의에 관한 자료 중 믿을만한 자료는 여기
http://www.cprogramming.com/declare_vs_define.html
대강 요약하면,
정의는 어떤 object( function, class, variable 등등) 의 모든 attribute를 기술하는 것이고,
선언은 그 중 (컴파일 등을 위해) 필요한 일부(타입과 이름)를 기술하는 것을 의미한다.
( 보다 정확한 차이점은 다른 분께서.. )
따라서 정의도 자동적으로 선언이 되죠.. 선언은 정의가 될 수 없고요..
shint님이 답글로 다신 첫번째 링크는 "struct"의 정의와 "변수"의 정의를
섞어서 완전히 잘못 설명하고 있더군요..
struct x {int i;};
는 struct x 라는 새로운 "타입"을 정의하는 것이고,
struct {int i;} x;
는 이름없는 struct 타입의 "변수" x를 정의하는 것입니다.
struct x;
이것은 struct x라는 struct 타입을 선언하는 것이고요.
주로 전방선언에서 사용됩니다.
..
C와 C++은 각각의 표준이 따로 존재하며 각 표준에서 말하는 declaration과 definition은 미묘한 차이가 있어보입니다.
C표준인 C99에서는 struct x { int i; };와 같은 것은 Tag에 대한 declaration(선언)에 해당하는 것으로 알고 있습니다.
(C99 표준 6.7.2.3 Tags 절 참조)
이러한 미묘한 차이의 대표적인 예로는 typedef가 있을 수 있습니다. typedef의 경우 C++에서는 선언에 해당하지만 C에서는 정의에 해당합니다.
말씀하신 내용이
말씀하신 내용이 정확하네요
http://bytes.com/topic/c/answers/220110-declaration-vs-definitio
가 제가 현재까지 찾은 자료 중 가장 깊이 있는 논의입니다. 특히 아래에서 두번째.
말씀하신 표준도 적절히 인용되고 있고요..
그러면 c에서는 "structure definition"은 없는거네요,
"Defining" declaration 이라고 부를 수는 있겠네요.
좋은 정보 감사합니다.
확인한 내용입니다.
좀 깁니다.
Visual C 디버깅 c cpp랑
gdb 덤프 gcc g++ 내용입니다.
말씀 하시는 내용을 이해하기 어려워서. 그냥 소스 디버깅 결과를 떠왔습니다.
http://blog.naver.com/my_1028?Redirect=Log&logNo=50014525423
http://www.villa4u.co.kr/jbn/bbs/board.php?bo_table=clp2&wr_id=29
http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=1040101&docId=63837765&qb=7ZSE66Gc6re4656oIOyEoOyWuA==&enc=utf8§ion=kin&rank=1&search_sort=0&spq=0
//참고용
http://kldp.org/node/114775
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기