Windowsで次のコードスニペットをコンパイルする場合:
#include <glad/glad.h>
#include <Windows.h>
int main() {}
次の警告が表示されます。
[...]\minwindef.h(130,1): warning C4005: 'APIENTRY': macro redefinition (compiling source file [...])
[...]\include\glad/glad.h(32): message : see previous definition of 'APIENTRY' (compiling source file [...])
これは、次のWebサービスを使用して0.1.33でうれしいです: https ://glad.dav1d.de/#profile = core&language = c&specification = gl&api = gl%3D3.0
プロジェクトでエラーとして警告を有効にしました。つまり、ビルドを成功させるには、 glad.h
を含めた後、 APIENTRY
の定義を解除する必要があります。 glad.h
の最後でマクロの定義を解除すると、その問題を防ぐことができます。
喜ぶ前にwindows.h
を含めてください。
@Dav1dde私に戻ってきてくれてありがとう。 これは確かにこの縮小された例では機能しますが、私の実際のコードはそれよりも複雑です。 私自身はWindows.h
を直接含めていません。それは、それを行う別のサードパーティライブラリです。 そして、私のコードの構造は、 glad
を含める前に、他のライブラリを常に簡単に含めることができるようなものではありません。
〜ローダーコードの最後にすでに#undef APIENTRY
があるようですが、ローダーを生成していないときは存在しません。〜
編集:ああ、気にしないでください、それはヘッダーではなく、 glad.c
にあります。
glad.h
が最後にAPIENTRY
の定義を解除してはならない理由はありますか? それが理にかなっていると思われる場合は、変更を加えるためのPRを作成できてうれしいです。
正しく定義を解除するには、最初に定義したかどうかを確認する必要があります(WindowsからAPIENTRY
を定義解除することはできません)。 glad2ブランチはそれを適切に行い、 APIENTRY
の代わりにカスタム定義を使用します。
ところで。 公式のgl.h
にもまったく同じ問題がありますが、 APIENTRY
だけを定義する代わりに、 windows.h
が含まれています(これも同様に喜んで行われ、それが役に立ったよりも多くの問題を引き起こしました)。
私たちがそれを定義した場合、未定義は大丈夫な解決策だと思います。
いつものようにPRと意見を歓迎します
PRをしたばかりです。あなたの考えを教えてください。
ところで。 公式のgl.hにもまったく同じ問題がありますが、APIENTRYだけを定義する代わりに、windows.hが含まれています(これも以前は嬉しかったので、役に立ったよりも多くの問題が発生しました)。
ええ、うれしいことにWindows.h
が含まれていないのを見てとてもうれしかったです🙂
glad1でこれに適切に対処する方法がわからないので、 APIENTRY
をまったく定義していないglad2
ブランチ( https://glad.sh
)を試すことができます。
glad1には簡単な解決策がないようで、glad2はすでに実用的な代替手段を提供しているので、これを閉じます。