2009-10-13 6 views
2

안녕하세요, 나는 C++로 작성된 것들을 윈도우 비쥬얼 스튜디오 2008에 유닉스 기반으로 포팅해야합니다. 다음 코드는 void **로 포인터 데이터 타입 - 데이터 포인터를 구현합니다. '배열': 형식 매개 변수 누락 생성자 구문 오류 C2461 - 유닉스에서 윈도우로 C++ 코드 포팅


struct array 
{ 
    int id; 
    void **array; // store the actual data of the array 
    // more members 
} 

내가 유닉스에 괜찮아하지만 난 MSVS 2008하려고 할 때이 오류가 발생 ++ g 컴파일

. 구성원을 '배열'에서 다른 것으로 변경하면 컴파일러에서 구성원 이름 '배열'이 실제로 구조체 배열의 생성자라고 생각하는 것 같습니다. 구조체와 같은 멤버의 이름을 지정하는 것은 바람직하지 않지만 이미 그렇게 작성되었습니다. 이 문제를 무시하도록 MSVS 컴파일러에 지시 할 수 있습니까? 그렇지 않으면 구조체 이름과 같은 모든 멤버의 이름을 변경해야합니다.

+0

Visual Studio의 C++ 컴파일러로 컴파일해야합니까? MinGW를 사용하여 Windows 용으로 컴파일하면 많은 코드를 변경하지 않고 컴파일 할 수 있습니다. –

+0

* managed * C++로 이식하려고합니까? 가능하다면 관리되지 않는 C++로 포팅하는 것이 좋습니다. –

답변

5

GCC 컴파일러의 버그를 처리하고 있습니다. C++ 언어는 이름이 클래스 이름과 동일한 데이터 멤버를 명시 적으로 금지합니다 (9.2/13 참조). MS 컴파일러는 이에 대해 불평 할 권리가 있습니다. 또한 모든 C++ 컴파일러는이 경우 진단 메시지를 발행해야합니다. GCC는 '-ansi-pedantic -Wall'모드에서도 침묵하므로 GCC의 명백한 버그입니다.

Revison : 위에서 말한 것은 C++ 언어의 "고전적인"C++ 98 사양에서만 정확합니다. 최신 사양에서이 요구 사항은 정적 데이터 멤버에만 적용됩니다. 비 정적 데이터 멤버는 이제 클래스와 이름을 공유 할 수 있습니다. 이 변경이 개정 된 표준의 공식 버전에 이미 포함되어 있는지 여부는 알 수 없습니다.

즉, 두 컴파일러가 각각 고유 한 방식으로 올바르다는 의미입니다. MS 컴파일러는 "고전적인"C++ 98 언어 스펙을 따르는 반면, GCC는 더 최근의 것을 구현하는 것으로 보인다.

+0

그렇다면 MinGW의 컴파일러로 컴파일 할 수 있어야합니다. GCC의 포트. GCC와 같은 행동 (버그가있는 행동 포함)을 기대합니다. –

+0

C++ 2003 (9.2/13 절)입니다. 단락 13a는 클래스에 사용자 선언 ctor가 포함되어 있으면 비 정적 데이터 멤버도 클래스 이름과 다른 이름을 가져야한다는 요구 사항을 추가합니다. –

3

나는 당신이 "좋은 습관이 아닙니다"라고 묘사하는 것을하고 있다면 그것을 바꾸어야한다고 말하고 싶습니다.

+0

문제는 유닉스 용으로 작성된 C++ 코드가 저에게 쓰여지지 않았기 때문입니다. 내 작업은 Windows에서 포트를 그냥 사용하는 것입니다. –

2

특성의 이름을 클래스 이름과 동일하게 변경했습니다. 이렇게하면 코드를 더 이식성있게 만들 수 있습니다. 앞으로 다른 컴파일러로 옮겨야 할 경우이 문제에 다시 참여하지 않을 것입니다.

관련 문제