2013-06-04 2 views
0

VS2012에서 미리 컴파일 된 헤더를 사용하는 Qt 프로젝트가 있습니다 (관련이 있는지 확실하지 않음). 컴파일되어 제대로 작동합니다. 그러나 QtCreator에서 동일한 프로젝트를 컴파일하려고하면 오류가 표시됩니다. 우선, 두 프로젝트가 서로 일치하고 이전에 올바르게 구성되었습니다 (컴파일되고 잘 작동 함). 그러나 코드가 최근에 변경된 후에 뭔가 잘못되었습니다.'식별자'에는 이미 본문이 있지만 식별자를 찾을 수 없습니다.

오류 :

pch.h:34: error:C2084: function 'void handleExceptionByShowingMessage(std::exception &)' already has a body 
main.cpp:16: error:C3861: 'handleExceptionByShowingMessage': identifier not found 

이들은 (인라인도) pch.h에 정의 된 또 다른 기능을 가진 30 개 + 라인과 몇 가지 더 CPP 파일에 이동합니다. 그러나 모든 오류는 유사합니다. pch.h에서

:

inline void handleExceptionByShowingMessage(std::exception &e) 
{ 
    QMessageBox msgBox; 
    msgBox.setText(QString::fromUtf16((ushort*)e.what())); 
    msgBox.setStandardButtons(QMessageBox::Discard); 
    msgBox.setIcon(QMessageBox::Warning); 
    int ret = msgBox.exec(); 
} 

나는 그냥 정기적으로 사용 때문에 기능이 cpp 파일에서 호출 붙여 넣기하지 않습니다. 모든 cpp 파일은 정확히 pch.h (첫 번째 코드 줄)을 포함하고 내가 말했듯이 VS2012 (코드 컴파일러는 실제로 QtCreator가 실제로 사용하는 ...)에서 정확히 동일한 코드 및 파일 구조가 작동합니다.

더 많은 코드/정보가 필요하면 알려주십시오.

업데이트 : 예, 모든 헤더가 #pragma once 있습니다. 비록 재미있는 고지 - 나는이 두 함수 정의를 더미 헤더 파일로 옮기고 pch.h에 포함 시켰을 때, 프로젝트는 잘 컴파일되었다.

+1

pch.h에 한 번 가드 보호 또는 #pragma가 있습니까? – slaphappy

+0

물론입니다. 또한 내 질문에 대한 업데이트를 참조하십시오. – NPS

+0

'pch.h '는 두 번 포함된다고 생각합니다. 파일을 파싱하는 동안 프리 컴파일 된 헤더를로드하는 동안 한 번,'#pragma once'는 agaisnt를 보호하지 않습니다. – slaphappy

답변

2

#pragma once은 지시문이 포함 된 파일이 여러 번 포함되지 않도록합니다. 사전 컴파일 된 헤더가로드 될 때 pch.h의 미리 컴파일 된 헤더 파일이 포함되고 파일이 컴파일 될 때 두 번째 파일이 포함됩니다. #pragma 지시문은이 파일을 별도의 파일로 간주하므로이 컨텍스트에서는 작동하지 않습니다.

pch.h 파일 (또는 stdafx.h)을 최적화하고 이상적으로 만 #includes 다른 헤더 파일에 소스 코드를 포함 할 수 없습니다. 그런 식으로 여러 번 포함하면 문제가되지 않습니다.

다른 해결책은 포함 보호 (#ifndef PCH #define PCH #endif)를 사용하는 것이므로 파일을 여러 번 포함 할 수 없습니다.

1

코드가 헤더에 있으면 static inline 시도해보십시오. 나는 inlinestatic을 암시하지 않는 이유를 알지 못한다.

+0

도움이되지 않습니다. – NPS

관련 문제