g++ 과 vc++ 컴파일 했을때의 차이점?
글쓴이: nayana / 작성시간: 월, 2004/04/19 - 6:52오후
소스는 다음과 같습니다.
#include <iostream> #include <cstddef> // size_t 사용 #include <memory> // memset() 사용 using namespace std; // Point 클래스 정의 class Point { public : // new/delete 연산자 함수 정의 void *operator new(size_t size); void *operator new(size_t size, int x, int y ); void operator delete(void *p); // 출력 연산자 함수 정의 friend ostream& operator<< (ostream& co, Point pt); // 좌표값 (x,y) int x,y; }; // new 연산자 함수 정의 // 메모리를 할당한 다음 0으로 초기화한다. void *Point::operator new(size_t size) { void *p = new char [size]; // 메모리 주소 p 부터 size 크기만큼 // 모두 0 값으로 채운다. memset(p, 0, size); // new() 함수가 불렸다는 메시지 출력 cout << "new() \n"; return p; } // 인자를 가진 new 연산자 함수 정의 // 메모리를 할당한 다음 0으로 초기화한다. void *Point::operator new(size_t size, int x, int y ) { void *p = new char[size]; // 주어진 값으로 멤버값 초기화 int *wp = (int*)p; *wp = x; *(wp+1) = y; cout << "new() 초기화 \n"; return p; } // delete 연산자 함수 정의 void Point::operator delete(void *p) { // delete() 함수가 불렸다는 메시지 출력 cout << "delete() \n"; // 원래 delete 연산자를 부를 때 :: 연산자 이용 ::delete p; } // 출력 연산자 함수 정의 ostream& operator<< (ostream& co, Point pt) { co << "(" << pt.x << "," << pt.y << ")"; return co; } void main() { // (1) 정의한 new 연산자 함수 Point* pt1 = new Point(); cout << *pt1 << endl; // (2) 인자를 가진 new 연산자 함수 Point* pt2 = new(16,32) Point(); cout << *pt2 << endl; delete pt1; delete pt2; }
vc++에서 컴파일 했을때 에러 입니다.
C:\homework\homework.cpp(73) : error C2593: 'operator <<' is ambiguous C:\homework\homework.cpp(77) : error C2593: 'operator <<' is ambiguous
즉 모호하다고 나옵니다.
그런데.. g++ 로 했을때는 다음과 같은 warning 나오고 실행이 잘됩니다.
ex06.cpp: In static member function `static void Point::operator delete(void*)': ex06.cpp:62: warning: deleting `void*' is undefined
이러는 이유가 무엇인지요...
지금 c++ 공부하면서 두군데에서 컴파일 시키면서 공부를 하고 있는데..
컴파일 마다 다른에러를 냅니다.
Forums:
vc++ 코드를 직접 VC에서 compile해본 것은 아니므로...추
vc++ 코드를 직접 VC에서 compile해본 것은 아니므로...
추측하여 말하면...
operator << 의 두번째 인자로, Point pt 보다 const Point & pt 를 써보시고.
g++ warning에 대해서는
::delete p; 를 ::delete[] (char *)p; 로 해보세요.
---
http://coolengineer.com
일단 답변 해주신점 감사합니다.님의 말씀대로 하니까..윈도우 나 리눅
일단 답변 해주신점 감사합니다.
님의 말씀대로 하니까..윈도우 나 리눅스에서 양호하게돌아갑니다.
왜 윈도우나 리눅스에서 이런 차이가 나는건가요?
윈도우와 리눅스의 차이가 아니라, 컴파일러의 차이죠...그런 차이
윈도우와 리눅스의 차이가 아니라, 컴파일러의 차이죠...
그런 차이는 많습니다. 그냥 이해해야지요...
이런 것들 때문에, 포팅만 가지고도 경력으로 사는 사람들이 있는 있습니다.
---
http://coolengineer.com
이번에 너무 좋은걸 알게 된것 같습니다.컴파일러의 차이가 이러게 많다
이번에 너무 좋은걸 알게 된것 같습니다.
컴파일러의 차이가 이러게 많다는것을 .....
제가 오늘 하루종일 생각해도 하지 못한것을
단숨에 하시다니 존경 스럽니다.^^
pynoos님의 답변은 언제나 간단명료하면서 멋져서 좋습니다.그런
pynoos님의 답변은 언제나 간단명료하면서 멋져서 좋습니다.
그런데, "남성형이 위자드인 단어" <== 이것이 아주
오래전부터 궁금하군요. 개인 질문을 할 곳이 없군요. :(
* 그리고, 사진 업그레이드 자주하세요 커가는 모습이 보기좋습니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
[quote="mach"]"남성형이 위자드인 단어" <== 이것
pynoos님은 아니지만.. 제생각에는
위치 가 "남성형이 위자드인 단어" 라고 쓰신건
위치 = witch = 마녀, 여자 마법사 => 남성형은 wizard
가 되므로, 발음이 비슷한 단어를, 언어 유희로 풀어쓰신게 아닌가 생각됩니다. ^^
pynoos님 맞나요?
0x2B | ~0x2B
- Hamlet
[quote="nanosec"][quote="mach"]"남성형이 위
쿠~~ 맞습니다. 말장난이죠...
ICON관련해서는, 그러지 않아도 딸 애를 ICON으로 쓰는 것이 자라면서 계속 고쳐야하는 부담이 있어서 아예 다른 것으로 바꿀까 생각중입니다.
아는 친구한테 캐리커쳐나 하나 부탁해볼까나...
---
http://coolengineer.com
저것은 using namespace std;에서 선언된것과 혼동이
저것은
using namespace std;
에서 선언된것과 혼동이 된다는 소리 같은데요,,,
아마 저 에러나는 코드 다음줄에
using namespace std; 를 써주시면 에러 안날겁니다.
워닝없이 컴파일은 되겠지만.. 기대하신대로 동작할런지는 의문이네요.
워닝없이 컴파일은 되겠지만..
기대하신대로 동작할런지는 의문이네요.
위의 코드를 작성하신게 어떤 의도이신지 제가 확실히 이해가 안되어서 그러는데요,
몇가지 지적을 해보자면..
1. 만약 아래 new 오퍼레이터가 클래스의 x,y 멤버를 세팅하기 위한것이라면,
void *operator new(size_t size, int x, int y );
Point 에 가상함수가 한개라도 존재할경우 위 오퍼레이터는 제기능을 수행하지 못합니다.
의도하신 동작인지요?
2. 혹시 위의 코드가 두번째에 (16,32) 를 출력하기를 기대하신 건가요?
만약 그렇다면... 실행해 보시면 아시겠지만 기대대로 동작하지 않습니다.
댓글 달기