2010-05-13 2 views
3

내가 (에서라도에 GCC 4.2)이이 경고를 받고 있어요보다 큰 가시성을 선언 :C++ : 경고 : '...'해당 분야의 '... :: <anonymous>'유형

/사용자/프로그램/프로그램/openlierox/빌드/Xcode /../../ src/main.cpp : 154 : 0 /Users/az/Programmierung/openlierox/build/Xcode/../../src/main. CPP : 154 : 경고 : 'startMainLockDetector() : MainLockDetector는'해당 분야의 유형과 가시성 선언 'startMainLockDetector() : MainLockDetector :: < 익명>'

/사용자/AZ/Programmierung/openlierox/build/Xcode /../../ src/main.cpp : 154 : 0 /Users/az/Programmierung/openlierox/build/Xcode/../../src/main.cpp:154 : 경고 : (? 무엇 가시성을) 나는 이러한 경고의 의미를 정확히 모르겠어요

struct Action { 
    virtual ~Action() {} 
    virtual int handle() = 0; 
}; 


static void startMainLockDetector() { 
    /* ... */ 

    struct MainLockDetector : Action { 
     bool wait(Uint32 time) { /* ... */ } 
     int handle() { /* ... */ } 
    }; 

    /* ... */ 
} 

과 'startMainLockDetector() : MainLockDetector는'이 코드에서 그것의 기초 '액션'

보다 더 큰 가시성 선언 그들을 고치는 법. (정말로 MainLockDetector 클래스가 해당 함수에 대해서만 로컬이되기를 바란다.)

다른 컴파일러 (clang, 이 코드에 대해 아무런 경고도 얻지 못했습니다.

+0

어떤 필드가 ''입니까? 로컬 클래스의 내용을 게시하십시오. –

+0

좋습니다. 코드가없는 전체 구조체입니다. – Albert

답변

-4

상속을 공개적으로 선언하는 것을 잊었 기 때문입니다.

struct MainLockDetector : public Action { 
     bool wait(Uint32 time) { /* ... */ } 
     int handle() { /* ... */ } 
    }; 

이렇게하면 "작업"구성원이 비공개가됩니다. 하지만 Action의 private 멤버를 public (struct의 public default)으로 오버라이드했습니다. 그러면 캡슐화가 중단 될 수 있으므로 경고가 표시됩니다.

+1

이것은 나에게 의미가 없습니다. 자신을 "구조체의 공용 기본값"이라고 말하면 "공용"은 선택 사항입니다 (구성원 및 상속의 기본값 임). –

+0

변경 사항이 없으며 여전히 동일한 경고입니다. 또한 'public'은 구조체에 의미가 없습니다. – Albert

+0

'public' 상속 선언은이 문제와 관련이 없습니다. –

1

공유 라이브러리에 문제가있는 것 같습니다. 공유 라이브러리를 작성하고 있다고 가정합니다. this explanation을보세요. 명령 행 옵션 -fvisibility-inlines-hidden을 추가하십시오. 문제는 gcc가 Action이 (실행 파일 및 라이브러리 연결에 보이지 않음) 반출되지 않는 반면 MainLockDetector (실행 파일 및 라이브러리 연결에 표시) 심볼을 내보내려고한다는 것입니다. 따라서 MainLockDetector의 가시성은 실제로 Action의 가시성보다 높습니다.

+0

아니요, 공유 라이브러리가 아니며 응용 프로그램 일뿐입니다. 하지만 MainLockDetector가 정확히 내보내지고 Action이 아닌 이유는 무엇입니까? – Albert

+0

링크 된 종이를 읽었습니까? 흥미로운 부분은 2.2.4 절입니다. – ablaeul

+0

좋아, 지금 읽었어야한다. (2.2.4를 제외하고 모두가 아니라 그 이상, 대부분 2. *). 정말 흥미로운. 그러나 내 문제와 관련된'-fvisibility-inlines-hidden'은 무엇입니까? 내가 명시 적으로 인라인으로 명시되지 않은 startMainLockDetector가 있기 때문입니다. 또한 액션을 왜 정확히 수출하지 않는가? 지금까지 내가이 문서를 이해하는 한, 모든 것이 기본적으로 수출되어야하므로 Action이 아닌 이유는 무엇입니까? – Albert

3

이 문제를 해결하려면 다음 중 하나를 시도하십시오.

  1. #pragma GCC visibility push() 문을 사용하십시오.

    #pragma GCC visibility push(hidden) 
    struct MainLockDetector : Action { 
        bool wait(Uint32 time) { /* ... */ } 
        int handle() { /* ... */ } 
    }; 
    #pragma GCC visibility pop 
    
  2. __attribute__ ((visibility("hidden")))과 같이 사용하십시오.

    struct __attribute__ ((visibility("hidden"))) MainLockDetector : Action { 
        bool wait(Uint32 time) { /* ... */ } 
        int handle() { /* ... */ } 
    }; 
    
  3. -fvisibility = default 명령 줄 옵션을 추가하십시오.

자세한 내용은 http://gcc.gnu.org/wiki/Visibility을 참조하십시오.

+0

제 경우에는'struct __attribute__ ((visibility ("hidden"))) StructName {....};'이 필요했습니다. – Pavel

관련 문제