c++ 모듈화 프로그래밍 static cost int 관련 switch 에러 질문이요 ~
안녕하세요 ~
헤더파일 aaaaaa.h
#include
#include
class aaa{
public:
static const int pipe;
};
void cccc();
----------------------------------------
Main.cpp
#include"aaaaa.h"
const int aaa::pipe =1;
void main(){
switch(1)
case aaa::pipe:
printf("???");
cccc();
}
-----------------------------------------------
dddd.cpp
#include"aaaaa.h"
void cccc(){
int a = 1;
switch(a)
{
case aaa::pipe : // 에러 부근 !!!
}
printf("%d",aaa::pipe);
}
--------------------------------------------------------
질문 1>
단일 프로그래밍을 할때는 정상적으로 출력이 되어 지는데
모듈화를 시켜서 프로그래밍을 짜면 case 부근에서 에러가 발생합니다.
모듈화를 잘못 했나 하고~ printf("%d",aaa::pipe); 문으로는 잘 출력이 되는데 왜 그런건가요??
질문2>
만약에 위의 구문이 문법적으로 안되는 것이라면..
#define 으로 전역 적으로 상수화 시키는법 말고 다른 좋은 방법이 있을까요??
enum 도 사용해보았는데 enum은 범위나 컴파일러의 호환성등 문제의 소지가 있다고 해서 생략 했습니다.
inline 함수로 짜는방법도 있겠지만 변수 처럼 사용하고 싶어서요..
개발자님들께서는 주로 어떠한 방법으로 class 안에 변수를 상수화 시켜 이용하시나요??
static 변수가 선언되는 모듈에서 변수를 생성하고
static 변수가 선언되는 모듈에서 변수를 생성하고 초기화하세요.
답변
위에 static 변수가 .h에 선언되어 있고 .cpp에 정의 한다음 초기화 돼어 있는데..요...;;
무슨 말씀 이신지?;;
h 파일이 여러 cpp 파일에서 include 되기
h 파일이 여러 cpp 파일에서 include 되기 땜에 문제가 됩니다.
h 파일에서 정의하세요.
네~ 답변에 감사드립니다. .~ 문제는 해결이
네~ 답변에 감사드립니다. .~
문제는 해결이 되었습니다...
질문>
int형에서 는 바로 초기화 해주면 문제가 되진 안네요..
그런데.. char 등 다른 자료형은 외부에서 정의 를 해줘야 하는데...
그러한 이유는 혹시 무엇때문인지 설명을 첨가 해주실수 있으신가요??
static 의 경우는 클래스 멤버로 외부에서 정의 초기화 해주고 있는것으로 아는데 ..;;
const static int 는 클래스에서 바로 초기화 해주면,,, 문제가 생기지 안네요.. ;;
또 const static int 를 단일 cpp 일경우(분할컴파일 하지 않은경우) 이부분이 문제가 되지 않는데
분할컴파일을 할경우는 외부에 정의 주면 문제 돼네요..
질문>
이것이 헤더와 .cpp 를 분리한 분할컴파일 경우에 .. 문제가 생기는 이유가 궁금한니다...
질문>
위의 쏘스는 또한 case 안에서만 사용하면 에러가 위의 쏘스는 발생이 됩니다... 다르게 .cpp 에서 사용하면 정상출력이 이루어 지고요...
이부분또한 질문 드립니다....
static 멤버는 하나의 스토리지만을
static 멤버는 전체 프로그램에서 하나의 스토리지만을 가지는데,
메인함수에서 다음의 정의 시에 스토리지가 결정됩니다.
const int aaa::pipe =1;
스토리지가 결정되었으니 맘 놓고 cccc(); 를 호출할 수 있다고 생각하실지 모르겠지만,
cccc() 가 컴파일 되는 시점에 스토리지가 결정되어 있었느냐가 문제입니다.
cccc() 가 메인 함수보다 먼저 컴파일되었다면 문제가 돼죠.
Thinking in C++ 에 저 문제가 자세히 설명되어 있는 걸로 기억하는데 참조하시길.
C++의 길은 멀고도 험하네요. 저도 예전에
C++의 길은 멀고도 험하네요.
저도 예전에 C++을 사실상 마스터했지만 아직도 첩첩산중이근영.
댓글 달기