구조체 사용중 초기화에 대해

iam502의 이미지

typedef struct
{
char a;
char b;
} TEST_T;

void function_a()
{
//구조체 변수
TEST_T st;

st = (TEST_T){1,1};
}

+++++++

구조체 멤버에 값을 대입하는 경우 보통은 아래와 같이 설정하겠지만,
st.a = 1;
st.b = 1;

위의 function_a()에서와 같이
사용중에도 구조체에 값을 저런식으로 대입하는 경우
gcc로는 컴파일이 되지만,
VS2003에서는 컴파일 에러가 나는데 이유가 뭘까요?
그리고 해결 방법은 없을까요?

draca의 이미지

gcc 에서 제공하는 확장 문법으로 보입니다.
VS2003 에서는 지원하지 않죠...
해결 방법은 없어 보입니다.

익명 사용자의 이미지

drawline((struct point){.x=1, .y=1}, (struct point){.x=3, .y=4});

엄연한 표준 문법으로 C99에 새로 도입된 compound literal입니다. VS2003은 아직 도입하지 않은 듯 하군요. 다음 글의 복합상수 부분을 참고하십시오.

http://www.zdnet.co.kr/builder/dev/c/0,39030803,39131659,00.htm

김일영의 이미지

TEST_T st;
 
st = (TEST_T){1,1};

이건 초기화가 아니라 대입문이라서 그런 것 같네요.

TEST_T st = {1, 1};

이렇게 하면 에러가 안 나야겠지만... VS2003에서 에러가 난다고 하셨죠?
초기화값 1을 숫자 대신 문자 형태로 쓸 수 밖에 없을 것 같네요...

snowall의 이미지

즉, 따옴표로 둘러싸면 되겠군요.
--------------------------
snowall의 블로그입니다.
http://snowall.tistory.com

피할 수 있을때 즐겨라! http://melotopia.net/b

익명 사용자의 이미지

char * 형이 아니라 char형이기 때문에 "문자열"은 대입할 수가 없고, 'a'나 숫자가 들어가야 합니다.
'1' 대신 1을 써서 문제가 생기는건 아닙니다.

김일영의 이미지

제 생각에도 문자형도 되고 숫자도 되어야 할 것 같은데
일전에 {1, 1}을 초기화값으로 쓰는게 VS2003에서는 안된다고 한 글을 보았거든요.
그렇다면 암만 생각해도 VS2003의 버그 같은데... 역시 {'a', 'a'} 이렇게 쓸 수 밖에 없는 것이겠죠?

익명 사용자의 이미지

#include "stdafx.h"
#include <stdio.h>
 
typedef struct { char a; char b; } TEST_T;
 
 
int _tmain(int argc, _TCHAR* argv[])
{
	TEST_T st = { 1, 1 };
	printf("%d %d", st.a, st.b);
	return 0;
}

VS2003은 없고 VS2008은 있는데 보다시피 잘 됩니다.

나는오리의 이미지

프로필 이미지 이 코드로 VC6,7,8에서 모두 잘되었습니다.

cppig1995의 이미지

문자가 아닌 숫자를 대입해서 문제인 게 아니라,
Microsoft C가 복합상수를 지원하지 않아서 문제인 겁니다.



It's High Noon...

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

cppig1995의 이미지

익명 사용자님께서는 복합상수 대입이 아닌 초기화를 시험하셨군요 -_-
제 Visual Studio 2008 (Beta 2 한글판)으로 실험해보았습니다.

1>c:\users\cppig1995\documents\visual studio 2008\projects\sandbox\sandbox.cpp(6) : error C2059: syntax error : '{'
1>c:\users\cppig1995\documents\visual studio 2008\projects\sandbox\sandbox.cpp(6) : error C2143: syntax error : missing ';' before '{'
1>c:\users\cppig1995\documents\visual studio 2008\projects\sandbox\sandbox.cpp(6) : error C2143: syntax error : missing ';' before '}'

이런 오류들이 나네요. 아무래도 저것과 효과가 똑같은

1. st2를 초기화하면서 값을 넣는다.
2. st = st2

를 써야 할 듯 합니다. ^^



It's High Noon...

Real programmers /* don't */ comment their code.
If it was hard to write, it should be /* hard to */ read.

익명 사용자의 이미지

-_-;

TEST_T st = {1, 1};
 
이렇게 하면 에러가 안 나야겠지만... VS2003에서 에러가 난다고 하셨죠?
초기화값 1을 숫자 대신 문자 형태로 쓸 수 밖에 없을 것 같네요...

이 내용에 대한 답변이니 초기화를 시험헤 보는게 당연하죠.

다시 한번 위의 논의 내용을 잘 읽어보세요.
compound literal이 VS2003에서 된다고 한 사람은 아무도 없습니다.

댓글 달기

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