c 기초질문임돠..

oranke의 이미지

1.test.h 파일

 
int global=0;

2.test_1.c
#include <stdio.h>
#include "test.h"

void main()
{
   printf("global value %d\n", global);
}

3.test_2.c
#include <stdio.h>
#include "test.h"

void test()
{
   printf("global value %d\n", global);
}

소스는 위와 같구여..
각각 컴파일 하고 링킹(cc test_1.o test_2.o -o test)
을 할때
WARNING: Duplicate symbols 라는
경고문구가 뜨는 데요..
왜 그런거죠?
참고로 test.h 파일에
int global=0;
이런식으로 초기화 하면 경고가 뜨는데

int global;
이런식으로 초기화를 하지 않으면
경고문구가 뜨지 않는 이유는 뭔가요?

SoftOn의 이미지

oranke wrote:
1.test.h 파일
 
int global=0;

위의 코드를

#ifndef __TEST_H__
#define __TEST_H__
int global=0;
#endif /* __TEST_H__ */

이렇게 변경해 보세요~~^^
oranke의 이미지

#ifndef __TEST_H__
#define __TEST_H__ 
int global=0;
#endif


고쳐도 이전과 같은 WARNING 입니다.^^;;
ld: 0711-224 WARNING: Duplicate symbol: global
SoftOn의 이미지

에궁.. -_-;;
global 변수의 초기화는 main 처음에 하세요..

SoftOn의 이미지

즉 이렇게 하시면...

1.test.h 파일

 
#ifndef __TEST_H__1
#define __TEST_H__1
int global;
#endif /* __TEST_H__1 */

2.test_1.c
#include <stdio.h>
#include "test.h"

int main(int argc, char** argv)
{
   global = 0;
   printf("global value %d\n", global);
   test();
 
   return 0;
}

3.test_2.c
#include <stdio.h>
#include "test.h"

void test()
{
   printf("global value %d\n", global);
}

이렇게 하면 잘되네요.. 테스트 해봤습니다..
그런데..
gcc 3.2에서 컴파일하니..
#define __TEST_H__ 는 이미 정의 되어 있네요..
내부적으로 사용하나 봅니다.. (.. )
그래서
#define __TEST_H__1 로 변경했습니다..

oranke의 이미지

에궁.. 이렇게 빨리 답변을 주시니 정말 감사 합니다..

그런데.. 사용법이야..
에러가 나면 피해 가면 되지만...

왜..
Header 파일의 변수에 초기화를 해주면
duplicate 경고가 나는지 궁금합니다.

int global;

int global=0; 

이나 명시적으로 초기화한 것만 틀리지
내부적으로 0값을 갔고 있을텐데..

왜 명시적으로 초기값을 주면 경고가 나는지요..?[/code]

SoftOn의 이미지

-- 본질적인 이야기는 피해갔군요..

WARNING: Duplicate symbols

말 그대로 심볼이 두번 정의 되었습니다..
test.h 를 두번 인크루드 되서 #ifndef로 막아놨습니다..
그런데 초기화는 잘모르겠네요... ( ..)
버려진의 이미지

헤더에 변수 선언은

extern int global;

이렇게 하시구요.

초기화는 한 파일에서만 합니다.

test_1.c에서

int global=0;

이렇게 했으면 test_2.c에서는 그냥 global=blah 쓰시면 되요.

익명 사용자의 이미지

c에는 여러가지 외부정의 모델이 있으며
표준 C 모델은 다음과 같습니다.
int i; /* 임시정의 */
ini i=0; /* 정의 */
extern int i; /* 선언 */
extern int i=0; /* 정의 */
( C언어 펀더멘탈 p.910 참조)
즉 초기치를 주면 정의가 되는겁니다.
그래서 링커는 정의가 두번이니까 경고를 주는거겠죠
저경우는 매크로 가드로 해결될경우가 아닌거 같은데요
두번 include 했을경우는 막아지겠죠...
자세한건 책이나 다른자료를 참고하세요

운형의 이미지

test.h

#ifndef __TEST_H__
#define __TEST_H__

extern int global;
#endif

test_1.c

#include <stdio.h> 
#include "test.h" 

int global; // int global = 1; 초기화가 필요하면 하고 아님 말고.

void main() 
{ 
   printf("global value %d\n", global); 
} 

test_2.c

#include <stdio.h> 
#include "test.h" 


extern int global;

void test() 
{ 
   printf("global value %d\n", global); 
} 

전역변수를 두개의 파일에서 사용하고 싶으신 거라면 위처럼 하시면되요.
헤더 파일에 변수 선언하지 않습니다. 해선 절대 안된다는건 아니지만
소스 규모가 커지면 듀플리케이티드 심볼 같은 메시지 많이 나오죠.
(gcc니까 워닝이지 ads같은 암컴파일러였음 에러로 나오지 않을까 생각하네요)

Do you think that's the air you are breathing now?

댓글 달기

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