union/struct에 대한 의문점, entry키워드?

vani2의 이미지

C++에서 이름없는 union이 선언/정의가 가능한데요,

1. 왜 union을 전역변수로 정의하여 사용하면 static 지정자를 붙여야 한다고 할까요?

2. 그리고 이름없는 구조체를 선언하면 아예 이름이 매겨지지 않나요?

3. 키워드 중에 entry라고 하는 C때 부터 있었던 키워드가 있던데요, 이 키워드는 무엇인가요?

klara의 이미지

> C++에서 이름없는 union이 선언/정의가 가능한데요,

아니오. C++ 표준에는 없는 내용입니다. C에서만 가능합니다.

> 1. 왜 union을 전역변수로 정의하여 사용하면 static 지정자를 붙여야 한다고 할까요?

static이 없다면 그건 외부 링크가 가능한 전역 변수가 되는데 이름없는 union을 다른 파일에서 가져올 수는 없지요.
참고로 이름없는 union은 타입이 아니라 객체입니다.

> 2. 그리고 이름없는 구조체를 선언하면 아예 이름이 매겨지지 않나요?

네. 마찬가지로 이름없는 구조체는 타입이 아니라 객체입니다.

> 3. 키워드 중에 entry라고 하는 C때 부터 있었던 키워드가 있던데요, 이 키워드는 무엇인가요?

그런 키워드는 C에도 C++에도 표준으로는 존재하지 않습니다. ANSI 표준이 제정되기도 이전의 오래된 C에서 엔트리포인트를 지정하기 위해서 쓰이던 키워드로 알고 있습니다.

vani2의 이미지

이름없는 union이 c++부터 생긴것이 아닌가요??

그리고 이름없는 union으로 묶으면 그 안의 멤버들을 따로따로 사용할 수 있다고 들었는데요

그렇다면 union자체가 아니라 객체 맴버를 사용하면 static을 붙이지 않아도 상관없지 않았을까요?

klara의 이미지

> 이름없는 union이 c++부터 생긴것이 아닌가요??

아니라고 말씀드렸는데 되묻는건 무슨 의도신지 모르겠습니다.
정말 맞는거냐는 뜻인가요? 의심스러우면 그냥 질문하지 마시고 구글링하세요. 금방 나옵니다.

> 그리고 이름없는 union으로 묶으면 그 안의 멤버들을 따로따로 사용할 수 있다고 들었는데요

union은 메모리를 공유합니다.
'따로 따로 사용한다'가 무슨 뜻인지 모르겠지만, 메모리를 따로 쓰지는 않습니다.

> 그렇다면 union자체가 아니라 객체 맴버를 사용하면 static을 붙이지 않아도 상관없지 않았을까요?

'객체 멤버를 사용한다'가 무슨 뜻인가요? 무슨 객체의 어떤 멤버를 말씀하시는 건가요? 그리고 '사용한다'는 걸 구체적으로 어떻게 한다는 뜻인가요?
의도하는 바를 나타내는(정확할 필요는 없습니다) 예제 코드를 보여주시는게 좋을 듯합니다.

vani2의 이미지

답글에 오해의 소지가 있었던것 같습니다.

제가 C++을 공부할때 도움을 받은 soen.kr이라는 사이트에서 이름없는 union이 C++부터 추가되었다고 나와있어서 혼란스러워 설명을 부탁한 것이였습니다.

따로따로 사용한다는 말은

union {
int a,b,c;
}

이렇게 있을때 태그가 없으므로 그저
a = 12; b = 30;
이렇게 사용함을 말한 겁니다.

그리고 이렇게 있을땐 union으로 묶여있긴하지만 멤버들을 태그없이 사용할 수 있기때문에 static을 붙이지 않아도 될꺼라 생각했습니다.

klara의 이미지

> 제가 C++을 공부할때 도움을 받은 soen.kr이라는 사이트에서

구글링해보세요.

> 멤버들을 태그없이 사용할 수 있기때문에 static을 붙이지 않아도 될꺼라 생각했습니다.

무슨 뜻인지 모르겠습니다. 태그의 유무와 static의 유무가 어떻게 연관이 된다는 뜻인가요?
이름이 없기 때문에 태그없이 쓰는게 아닙니다. 이미 선언되었기 때문에 그냥 쓰는 겁니다.
익명 공용체는 앞에서도 말씀드렸듯이 타입이 아니라 객체를 선언하는 겁니다.

태그를 써야 변수를 사용할 수 있다는 말은

int a;

라고 선언된 객체에 대해서 a를 쓸때마다 예를 들면 *(int*)&a = 1이라고 적어야 한다는 뜻인데, 이걸 의도하신 질문이 맞나요?
좀더 정확하게 하자면

struct A {
int a; char b;
};

여기서 태그는 A입니다.

struct A a;

로 객체가 선언되었을 때, a.a나 a.b를 쓰기 위해서 A라는 태그는 어디에도 명시할 필요가 없습니다.

vani2의 이미지

아 그렇군요

착각한듯하네요.

감사합니다.

익명 사용자의 이미지

>> C++에서 이름없는 union이 선언/정의가 가능한데요,

> 아니오. C++ 표준에는 없는 내용입니다. C에서만 가능합니다.

아닙니다. c99에서도 비표준입니다. 그동안 컴파일러 확장 기능으로 제공되었습니다.
c++11에서 표준에 들어왔습니다.

vani2의 이미지

아 그렇군요.

klara의 이미지

C++11이 아니라 C11에서 추가된겁니다. C++에는 존재하지 않습니다.

댓글 달기

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