2013-11-28 4 views
-1
큰 라인에서 클래스 Module이 같은 멤버 템플릿을 포함
In file included from /usr/local/Qt/linux-g++/include/QtCore/QLinkedList:2, 
    from /home/bamboo/Packages/Parser.h:17, 
    from /home/bamboo/Packages/Module.cpp:6: 
/usr/local/Qt/linux-g++/include/QtCore/qlinkedlist.h: In member function 'void QLinkedList<T>::clear() [with T = int]': 
/usr/local/Qt/linux-g++/include/QtCore/qlinkedlist.h:294: error: dereferencing pointer 'y' does break strict-aliasing rules 
/usr/local/Qt/linux-g++/include/QtCore/qlinkedlist.h:293: note: initialized from here 
/usr/local/Qt/linux-g++/include/QtCore/qlinkedlist.h:294: error: dereferencing pointer 'y' does break strict-aliasing rules 
/usr/local/Qt/linux-g++/include/QtCore/qlinkedlist.h:293: note: initialized from here 

: Parser<int> 및 클래스 파서 정의 :C++ 엄격한 앨리어싱 규칙과 오류를 컴파일 Qt를하고 QLinkedList

template <typename T> class Parser 
{ 
    // some stuff 
    QLinkedList<T> stuff; 
}; 

및 코드 컴파일이 조각 멋지게 gcc (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3로 그리고 멋지게 g++ (Ubuntu/Linaro 4.7.2-2ubuntu1) 4.7.2로 그리고 g++ (Debian 4.4.5-8) 4.4.5 ...와 나는 실패한다. 그리고 나는 전혀 모른다? 누구나이 오류 메시지를 보았고 누구든지 이것이 무엇을 의미 하는지를 알고 있습니까? 더 중요한 것은 그것을 해결하는 방법입니다.

+0

가 additonally이 문서가 그것을 아주 잘 설명 않습니다 (당신을 완화 할 수 있습니다 경우에 따라서, 유명한 용 프로그램에 C 코드의 많은이 -fno-strict-aliasing 컴파일됩니다) : http://cellperformance.beyond3d.com/articles/2006 /06/understanding-strict-aliasing.html – dhein

+0

그래,이 질문을 게시하기 전에 해당 게시물을 보았습니다. Qt 헤더는 실제로이 기술을 사용하고 있습니다 ... 그래서 이것은 다른 것입니다. – fritzone

+0

http://sscce.org를 만들면 다른 사람들이 그것을 컴파일하고 훑어 볼 수 있도록 더 나은 도움을받을 수 있습니다. 무슨 Qt 버전 btw? – Yakk

답변

0

앨리어싱은 포인터 int *idouble *d과 같은 주소를 가리키고 있음을 의미합니다. 여기

int i = 5; 
int *pi = &i: 
double *d = pi; 

경우 dpi 앨리어싱되도록.

내가 그것을 취급 ++ 정확히 어떻게 다 알 수없는> C99에 <

불법입니다,하지만 난 그게 환영 상상할 수 없다.

재미있는 코드를 테스트하려면 다른 최적화 수준에서이 코드를 시도하십시오.

당신은 GCC와 differen 결과를 얻을 4.2

uint32_t anint; 

int main(int arg, char** argv) 
{ 
    foo ((uint64_t *)&anint); 
    return 0; 
} 

void foo (uint64_t *dblptr) 
{ 
    anint = 88; 
    *dblptr = 86; 
    dosmthng (anint); 
} 

void dosmthng (uint32_t val) 
{ 
    printf ("%d\r\n", val); 
} 

당신이 -O2 이상을 할 경우 컴파일러는 엄격한 앨리어싱 규칙을 존중을 기대하고 적이 *dblptr을 기대하기 때문에 출력은 88이 될 것입니다 이 코드에서 사용되며 jsut은 라인을 제거합니다.

별칭을 사용하지 않아도되는 경우 컴파일러에 매개 변수 -fno-strict-aliasing을 제공 할 수 있습니다. 이로 인해 GCC는이 expection에 기반한 최적화를하지 않습니다.

하지만 어쨌든 C 유형의 코드 작성이 잘못된 경우 엄격한 ISO C 코드가 아닙니다.

관련 문제