|
클래스 내부에서 변수를 선언하는 것은 단지 이런 변수를 사용하겠다고 컴파일러에게 알려주기만 하는 것이고
실제 변수를 만들지는 않습니다. 그러나 클래스 외부에서 변수를 선언하는 것은 그자리에 메모리를 할당하고
진짜 변수를 만드는 것입니다.
#ifndef로 헤더가 여러번 포함되는 것을 막는 것은 맞습니다만 . 그 헤더가 여러개의 CPP파일에서 사용될때는
각각 사용하는 CPP파일마다 Command라는 변수가 생겨나는 것이고 당연히 링크에러가 나는 것이지요.
이경우에는 fmain.cpp와 ComPort.cpp에서 각각 include 하고 있고 링크에러 메시지가 정확히 지적해 주고 있습니다.
전역변수를 사용하고싶으시다면 헤더파일이 아닌 CPP에 선언하여서 사용하시고 다른 CPP에서 그 전역변수가
필요하시면 extern 선언하셔서 사용하시면 됩니다.
프로그램 초짜 님이 쓰신 글 :
: 도움글 정말 감사하게 받았습니다.
:
: 말씀하신대로 해결은 보았으나.. 의문점이 생겨 질문합니다.
:
: 헤더에서 기본적으로 선언을 하고
:
: CPP에서 사용을 하는게 제 기본 상식이엇습니다.
:
: 물론 헤더에서 #IFNDEF으로 중복 선언됨을 막았다고 판단했습니다.
:
: 근데 제가 이런저런 테스트를 해보니 그러치 못하군요.. 헤더 어디에서 선언하든 링크경고는 뜨고
:
: 실행은 되었습니다. 다른 컴파일이라면 무작정 에러라서 컴파일이 실행 안되었을 겁니다.
:
: 그 이유가 간단하게 설명되는 부분인지... 아니면 어려운 부분인지 조차도 구분이 안되네요
:
:
: 라스코니 님이 쓰신 글 :
: : h (헤더) 파일에는 가급적 실제 객체 선언이 되면 안됩니다.
: :
: : ComPort.h 에는
: : extern int Command;
: :
: : 이라고 고치시고,
: :
: : Comport.c 등에서
: : int Command; 로 선언하세요.
: :
: : 프로그램 초짜 님이 쓰신 글 :
: : : 다른 변수는 전혀없구요 Main 쪽에는 Command가 선언 되어있지 않습니다.
: : :
: : : Comport 쪽에서 변수를 Command1로 바꾸었으나 같은 증상입니다.
: : :
: : : 아마 인클루드할때 여러번 인클루드 되어서 그런거라는거 까진 알겟는데 해결을 못하고있습니다.
: : :
: : : 도움 부탁드립니다.
: : :
: : : 이길남.HoPe 님이 쓰신 글 :
: : : : Main 파일하고, Comport 파일에 Command 선언자가 둘다 포함되어 있다고 합니다.
: : : :
: : : : 변수 이름을 변경하여 보십시요. ^^;;
: : : :
: : : : 프로그램 초짜 님이 쓰신 글 :
: : : : : 프로그램을 하시느라 다들 고생 많으십니다.
: : : : :
: : : : : 6.0 기반이구요
: : : : :
: : : : : 기본 폼 하나에 폼 하나를 추가로 만들었습니다.
: : : : :
: : : : : Main 과 comport라고 명명 했습니다.
: : : : :
: : : : : comport에 헤더는
: : : : :
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : #ifndef ComPortH
: : : : : #define ComPortH
: : : : : //---------------------------------------------------------------------------
: : : : : #include <Classes.hpp>
: : : : : #include <Controls.hpp>
: : : : : #include <StdCtrls.hpp>
: : : : : #include <Forms.hpp>
: : : : : //---------------------------------------------------------------------------
: : : : : class TSetup : public TForm
: : : : : {
: : : : : __published: // IDE-managed Components
: : : : : private: // User declarations
: : : : : public: // User declarations
: : : : : __fastcall TSetup(TComponent* Owner);
: : : : : };
: : : : :
: : : : : int Command; //<<< 추가 하였습니다.
: : : : :
: : : : : //---------------------------------------------------------------------------
: : : : : extern PACKAGE TSetup *Setup;
: : : : : //---------------------------------------------------------------------------
: : : : : #endif
: : : : :
: : : : : 그러고 나서
: : : : :
: : : : : 다른 작업없이
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : #include <vcl.h>
: : : : : #pragma hdrstop
: : : : :
: : : : : #include "fMain.h"
: : : : : #include "ComPort.h" //<<<<<이부분입니다.
: : : : : //---------------------------------------------------------------------------
: : : : : #pragma package(smart_init)
: : : : : #pragma resource "*.dfm"
: : : : : TMain *Main;
: : : : : //---------------------------------------------------------------------------
: : : : : __fastcall TMain::TMain(TComponent* Owner)
: : : : : : TForm(Owner)
: : : : : {
: : : : : }
: : : : : //---------------------------------------------------------------------------
: : : : :
: : : : : 위와 같이 fMain.cpp에 추가 기입하였습니다.
: : : : :
: : : : : 그러고나서
: : : : : [Linker Warning] Public symbol '_Command' defined in both module D:\TESTCLASS\FMAIN.OBJ and D:\TESTCLASS\COMPORT.OBJ
: : : : :
: : : : : 에러 입니다.
: : : : :
: : : : : 무엇이 문제인지 도움 부탁드립니다.
: : : : :
: : : : : 가장 기본적인거이긴한데
: : : : :
: : : : : 저의 개념으로 헤더에 선언 cpp에서 인클루드...
: : : : :
: : : : : 하면 끝인데... ㅜㅜ
: : : : :
: : : : : 창피한일인건 알지만 알몸으로 덤벼 봅니다. 따끔한 조언 부탁합니다.
|