g++ 과 vc++ 컴파일 했을때의 차이점?

nayana의 이미지

소스는 다음과 같습니다.

#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++ 공부하면서 두군데에서 컴파일 시키면서 공부를 하고 있는데..
컴파일 마다 다른에러를 냅니다.
pynoos의 이미지

vc++ 코드를 직접 VC에서 compile해본 것은 아니므로...
추측하여 말하면...

operator << 의 두번째 인자로, Point pt 보다 const Point & pt 를 써보시고.

g++ warning에 대해서는
::delete p; 를 ::delete[] (char *)p; 로 해보세요.

nayana의 이미지

일단 답변 해주신점 감사합니다.
님의 말씀대로 하니까..윈도우 나 리눅스에서 양호하게돌아갑니다.
왜 윈도우나 리눅스에서 이런 차이가 나는건가요?

pynoos의 이미지

윈도우와 리눅스의 차이가 아니라, 컴파일러의 차이죠...

그런 차이는 많습니다. 그냥 이해해야지요...

이런 것들 때문에, 포팅만 가지고도 경력으로 사는 사람들이 있는 있습니다.

nayana의 이미지

이번에 너무 좋은걸 알게 된것 같습니다.
컴파일러의 차이가 이러게 많다는것을 .....
제가 오늘 하루종일 생각해도 하지 못한것을
단숨에 하시다니 존경 스럽니다.^^

mach의 이미지

pynoos님의 답변은 언제나 간단명료하면서 멋져서 좋습니다.

그런데, "남성형이 위자드인 단어" <== 이것이 아주
오래전부터 궁금하군요. 개인 질문을 할 곳이 없군요. :(
* 그리고, 사진 업그레이드 자주하세요 커가는 모습이 보기좋습니다.

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

nanosec의 이미지

mach wrote:

"남성형이 위자드인 단어" <== 이것이 아주
오래전부터 궁금하군요.

pynoos님은 아니지만.. 제생각에는
위치 가 "남성형이 위자드인 단어" 라고 쓰신건

위치 = witch = 마녀, 여자 마법사 => 남성형은 wizard

가 되므로, 발음이 비슷한 단어를, 언어 유희로 풀어쓰신게 아닌가 생각됩니다. ^^

pynoos님 맞나요?

0x2B | ~0x2B
- Hamlet

pynoos의 이미지

nanosec wrote:
mach wrote:

"남성형이 위자드인 단어" <== 이것이 아주
오래전부터 궁금하군요.

pynoos님은 아니지만.. 제생각에는
위치 가 "남성형이 위자드인 단어" 라고 쓰신건

위치 = witch = 마녀, 여자 마법사 => 남성형은 wizard

가 되므로, 발음이 비슷한 단어를, 언어 유희로 풀어쓰신게 아닌가 생각됩니다. ^^

pynoos님 맞나요?

쿠~~ 맞습니다. 말장난이죠...

ICON관련해서는, 그러지 않아도 딸 애를 ICON으로 쓰는 것이 자라면서 계속 고쳐야하는 부담이 있어서 아예 다른 것으로 바꿀까 생각중입니다.
아는 친구한테 캐리커쳐나 하나 부탁해볼까나...

lkjt의 이미지

저것은
using namespace std;
에서 선언된것과 혼동이 된다는 소리 같은데요,,,
아마 저 에러나는 코드 다음줄에
using namespace std; 를 써주시면 에러 안날겁니다.

Testors의 이미지

워닝없이 컴파일은 되겠지만..
기대하신대로 동작할런지는 의문이네요.
위의 코드를 작성하신게 어떤 의도이신지 제가 확실히 이해가 안되어서 그러는데요,
몇가지 지적을 해보자면..

1. 만약 아래 new 오퍼레이터가 클래스의 x,y 멤버를 세팅하기 위한것이라면,
void *operator new(size_t size, int x, int y );
Point 에 가상함수가 한개라도 존재할경우 위 오퍼레이터는 제기능을 수행하지 못합니다.
의도하신 동작인지요?

2. 혹시 위의 코드가 두번째에 (16,32) 를 출력하기를 기대하신 건가요?
만약 그렇다면... 실행해 보시면 아시겠지만 기대대로 동작하지 않습니다.

댓글 달기

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