extern으로 불러온 변수는 sizeof로 값을 알 수 없나요?

superkkt의 이미지

char *ftp_cmd[] = {
	"USER", "PASS", "ACCT", "CWD",
	"CDUP", "SMNT", "REIN", "QUIT"
};

위와같이 정의된 배열이 있습니다. 이 배열을 다른 파일에서 extern으로 불러와서 원소의 개수를 파악하기 위해 아래와 같이 sizeof를 하면 에러가 나네요.

cnt = sizeof(ftp_cmd) / sizeof(char *);

Quote:
pi.c:164: error: invalid application of `sizeof' to incomplete type `({anonymous})'

extern으로 불러온 변수는 sizeof를 할 수 없나요?

[/code]

doldori의 이미지

extern이어서 그런 것이 아니라 에러 메시지에 나와 있듯이 불완전형으로 선언했기
때문입니다. 배열의 경우 원소의 개수와 형이 모두 알려져야 완전형이 되는데. 아마
개수를 알려주지 않은 모양입니다.
extern char *ftp_cmd[];
헤더에 이렇게 선언하지 않으셨나요?

익명 사용자의 이미지

cinsk 님이 출현하셔서

http://www.cinsk.org/cfaqs/html/node3.html#SECTION00380000000000000000

와 같은 답변을 남긴다에 한표 ^_______^

superkkt의 이미지

두분 답변 정말 감사합니다. 덕분에 쉽게 해결했습니다. 조금만 뒤져보면 나오는 답을 못찾고 있었네요..

그리고 이건 약간 다른 질문인데요.. 위와같이 다른 파일에서 정의된 배열을 extern으로 가지고올때 헤더파일에 해당 배열에 대한 선언이 꼭 있어야 하나요?

지금은 헤더파일에 선언을 하지 않았는데 아무런 경고도 없길래 그냥 사용하고 있습니다.

======================
BLOG : http://superkkt.com

doldori의 이미지

superkkt wrote:
그리고 이건 약간 다른 질문인데요.. 위와같이 다른 파일에서 정의된 배열을 extern으로 가지고올때 헤더파일에 해당 배열에 대한 선언이 꼭 있어야 하나요?

물론이죠. 꼭 헤더에 의할 필요는 없지만 어쨌든 선언은 반드시 해야 합니다.

superkkt wrote:
지금은 헤더파일에 선언을 하지 않았는데 아무런 경고도 없길래 그냥 사용하고 있습니다.

두 가지 가능성이 있습니다. 선언이 있는데 없다고 생각하시거나 컴파일러가 엉터리이거나...
superkkt의 이미지

char *ftp_cmd[] = {
   "USER", "PASS", "ACCT", "CWD",
   "CDUP", "SMNT", "REIN", "QUIT"
};

이 자체가 선언과 정의를 동시에 하는게 아닌가요? 전 그렇게 생각해서 따로 헤더파일에 선언을 적지 않았습니다. 위 정의가 a.c라는 파일에 있고 a.h에는 위 정의와 관련된 내용은 없습니다. 이 상태에서 b.c 파일에서 아래와 같이 불러옵니다. (b.c가 a.h를 include는 하고있습니다)

void func()
{
    extern char *ftp_cmd[];
    ..
    ..
}

그리고 컴파일할때는 한꺼번에 하는 경우도 있고 파일별로 하는 경우도 있는데 경고가 안나오더라구요..

Quote:

# gcc -Wall -o test a.c b.c
..
# gcc -Wall -c a.c
# gcc -Wall -c b.c

제가 잘못 알고있는 부분에 대해서 지적 부탁드립니다. :oops:

======================
BLOG : http://superkkt.com

doldori의 이미지

superkkt wrote:
char *ftp_cmd[] = {
   "USER", "PASS", "ACCT", "CWD",
   "CDUP", "SMNT", "REIN", "QUIT"
};

이 자체가 선언과 정의를 동시에 하는게 아닌가요?


맞습니다.
superkkt wrote:
전 그렇게 생각해서 따로 헤더파일에 선언을 적지 않았습니다.

하지만 이 선언이 저절로 다른 소스 파일에 알려지지는 않죠. 그래서 보통 헤더에
선언을 하여 여러 소스에 알려지도록 합니다.

superkkt wrote:
위 정의가 a.c라는 파일에 있고 a.h에는 위 정의와 관련된 내용은 없습니다. 이 상태에서 b.c 파일에서 아래와 같이 불러옵니다. (b.c가 a.h를 include는 하고있습니다)

void func()
{
    extern char *ftp_cmd[];
    ..
    ..
}

선언하셨잖습니까. -_-; 이 선언은 a.h에 넣는 게 좋겠군요.
cinsk의 이미지

손님님 wrote:
cinsk 님이 출현하셔서

http://www.cinsk.org/cfaqs/html/node3.html#SECTION00380000000000000000

와 같은 답변을 남긴다에 한표 ^_______^


:wink:
superkkt의 이미지

doldori wrote:

void func()
{
    extern char *ftp_cmd[];
    ..
    ..
}

헙.. 이게 선언하는 부분이였군요.. :oops: C언어 펀더멘탈을 다시 한번 읽어봐야겠습니다. 감사합니다~

======================
BLOG : http://superkkt.com

댓글 달기

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