2016-08-01 2 views
0

내가 레지스트리 클래스 공장 함수를 등록하는 모듈 수준의 함수 호출을 사용하고 있습니다 :G ++ 4.9 - 모듈 범위에서 함수를 호출하지 않습니까?

static Controller * ctor(Device * device, const char *) { return new NullController(device); } 
static int s_id = DeviceRegistry::RegisterControllerClass("null", ctor); 

//------------------------------------------------------------------------------ 

NullController::NullController(Device * device) 
: Controller(device, "null", s_id) 
{ 
} 

경우 예 : DEV :: DeviceRegistry :: RegisterControllerClass는()입니다 네임 스페이스의 예에서 무료 기능 DEV. 이것은 Visual Studio에서 잘 작동하지만 GCC/Linux에서 실행될 때 코드가 호출되지 않는 것처럼 보입니다. RegisterControllerClass()를 중단하면 호출되지 않습니다. 컴파일러가 s_id 필드를 최적화하는 경우에 대비하여 기본 클래스를 생성하는 데 사용했습니다. 그래서 그게 아니라고 확신합니다. 이 코드의 문제점은 무엇입니까?

+1

번역 단위가 링크되어 있는지 확인해야합니다. 한 가지 방법은'main'에서 함수를 호출하는 것입니다. –

+2

모듈 스코프 란 무엇입니까? – NathanOliver

+0

번역 단위 (즉, cpp 파일 + 포함 헤더) 내에 있습니다. 그들이 '정적'으로 표시되지 않았다면 '글로벌'이라고 말했을 것입니다. –

답변

0

링커는 너무 영리 해 지려고 시도하고 있었고 호출되지 않았다고 생각하는 코드를 제거하려고했지만 간접적으로 호출되었습니다. 전체 아카이브 LIB -Wl, - -

라이브러리

-Wl, 주위 넷빈즈 링커 옵션 대화 상자에서 명령 줄 옵션을 추가 ... 노 전체 아카이브

문제를 해결합니다. 수다.

+0

W1? 농담하니? -Wl. –

+0

@KonstantinVladimirov lol, 재미있는 글꼴 ('l'을 변수로 사용하지 않는 것에 대한 코딩 규칙 기억) –

관련 문제