0

glmの一部のマクロが再定義されているという警告がXCodeでのみ表示され続けます。大きな問題ではありませんが、警告が煩わしいと思います。

犯人マクロの上に#ifndefブロックを置いても、システム全体が機能しない場合はどうなりますか?それらを含むアプリにリンクされている静的ライブラリにそれらを含めます。これが問題になる可能性があるので、2つのうちの1つから削除して、問題が解決するかどうかを確認しました。そうではありませんでした。

この警告は、Windowsでmingw g ++を使用している場合は表示されませんが、Xcode4では表示されます。glmバージョン0.9.3.4を使用しています。

警告:

"VECTORIZE2_VEC" redefined
This is the location of the previous definition

これは何百回も繰り返されます。

犯人コード(glmファイル_vectorize.hppから取得):

#define VECTORIZE2_VEC(func) \
template <typename T> \
GLM_FUNC_QUALIFIER detail::tvec2<T> func( \
    detail::tvec2<T> const & v) \
{ \
    return detail::tvec2<T>( \
        func(v.x), \
        func(v.y)); \
}

これに非常によく似たマクロが他にもいくつかあります。

4

1 に答える 1

1

上記のコメントに基づくと、次の3つのオプションがあるように見えます。

  1. コンパイルの警告を表示するだけです

  2. VECTORIZE2_VECの他の定義が#ifndefでラップしていないため、#includeを基準にしてVECTORIZE2_VECマクロ定義の場所を変更します(これによりコンパイル警告が発生します)

  3. すでに定義されていることを考慮して、本当にもう一度#defineする必要があるかどうかを検討してください。

オプション1は問題ありませんが、「コンパイル警告なし」の要件がある場合は、これは実際には良いことです。オプション2(私の意見では保守が難しくなる可能性があります)または3を選択する必要があります。

オプション2を実装するには、最初に定義されたインクルードの後で、マクロを必要とする他の#includeの前にマクロを定義する必要があります。#include 1つのファイルだけで元の定義とコンパイルエラーが発生した場合、これは不可能な場合があります。その場合、運が悪くなります。

file1.hに元のVECTORIZE2_VEC定義があり、file2.hに定義が必要であり、定義がないとコンパイルエラーが発生すると仮定すると、次の問題が修正され、エラーや警告が発生しなくなります。

#include <file1.h>

#ifdef VECTORIZE2_VEC 
  #undef VECTORIZE2_VEC 
#endif
#define VECTORIZE2_VEC(func) ....

#include <file2.h>

// ...
于 2012-10-08T17:50:04.433 に答える