2012-10-24 2 views
2

크로스 플랫폼 OpenGL 함수 로딩 라이브러리를 작성하고 있습니다. Windows에서 컴파일러 (이상한 점은 VS GCC)는 한 종류의 함수 포인터 (wglGetProcAddress의 반환 유형은 void(*)())를 다른 유형의 함수 포인터로 암시 적으로 변환하면 문제가없는 것 같습니다.함수 포인터를 저장할 때 GCC 경고를 표시하지 않습니다.

GCC on 그러나 그렇지 않습니다. glXGetProcAddressvoid(*)()을 반환하지만 항상 경고를 표시합니다. 그리고 OpenGL은 문자 그대로 수천 가지의 것들을 가지고 있기 때문에, 이것은 엄청난 진단 결과를 가져옵니다.

이 경고를 비활성화하는 방법이 있습니까? #pragma 또는 GCC가 종료되도록 코드를 재 배열하는 방법 중 하나를 사용 하시겠습니까? 나는 전체 #pragma diagnostic ignore -Wblahblah을 시도했지만, 내가 얻었던 경고와 일치하는 "blahblah"를 찾을 수 없었다.

+0

부수적으로, 그 중 모두를로드하는 것을 다룰 수있는 http://glew.sourceforge.net/을 확인해보십시오. – hexist

+0

아마도 'gcc -w'입니까? –

+1

@hexist : 예, GLEW를 대체하려고합니다. (https://bitbucket.org/alfonse/gloadgen/wiki/Home) 사용하지 마십시오. –

답변

3

올바른 유형을 얻으려면 제공된 매크로를 사용해야합니다.

gl3wBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)get_proc("glBindImageTexture"); 

가 중간에 이상한 PFNGLBINDIMAGETEXTUREPROC는 것을 예를 들어, gl3w OpenGL을 확장 로더에서 촬영,이 같이 선이 (당신은이 같은 코드를 생성하는 얻기 위해 파이썬 스크립트를 실행해야합니다) glBindImageTexture 함수의 올바른 함수 유형에 대한 매크로 (해당 이름은 실제로 P ointer F unctio NGLBINDIMAGETEXTUREPROC입니다.

+1

저는 무역에서 C 프로그래머가 아니지만 C 프로그래머가 불필요한 명시 적 캐스트를 수행하면 C에서 * bad *라고 말했고 암시 적 캐스트 시스템에서 처리하도록해야합니다. –

+1

@ 니콜 : 어디서 배웠는지 모르겠습니다. C에서는'void *'에서 다른 데이터 포인터 유형으로의 암시 적 캐스트가 있기 때문에 일반적으로'void *'를 다른 포인터 유형 (예 :'malloc'의 반환 값)에 명시 적으로 캐스트하지 않아야합니다. 그러나 * 함수 * 포인터는 완전히 다른 짐승입니다 - 암시 적 함수 포인터 캐스팅이 없으므로 필요할 때 명시 적으로 캐스팅해야합니다 (너무 자주해서는 안되지만 여기서는 좋은 사례입니다). –