1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

cpprestsdkとEigenを併用するとBDCSVD.hでコンパイルエラー(C4002/C3861)が発生する

Posted at

cpprestsdkとEigenを使用している環境で、コンパイルしようとすると次のエラーが出ました。

C4002	関数に似たマクロ呼び出し 'U' の引数が多すぎます	BDCSVD.h	1087
C4002	関数に似たマクロ呼び出し 'U' の引数が多すぎます	BDCSVD.h	1089
C3861	'Li': 識別子が見つかりませんでした	BDCSVD.h	1089
C3861	'Ln': 識別子が見つかりませんでした	BDCSVD.h	1087

検索してみると似たようなエラーを発見。

同じくBDCSVD.hでC4002を引いているようです。
これによると、cpprestsdkで使用しているUというマクロ(参照)とEigenで使用しているUというマクロ(参照)が競合しているようです。

具体的には、BDCSVD.hよりも先にcpprestsdk側のUが定義されてしまうと、コンパイルエラーになってしまうようです。

応急処置でこのように解決しました。

BDCSVD.h
#ifdef U
#define EIGEN_INTERNAL_U_PROTECTOR U
#undef U
#endif

// 元のソースコード

#ifdef EIGEN_INTERNAL_U_PROTECTOR
#define U EIGEN_INTERNAL_U_PROTECTOR
#undef EIGEN_INTERNAL_U_PROTECTOR
#endif

BDCSVD.hの最初と最後に上記のようなコードを追記します。
これでUを一旦別のマクロに避難させておき、コード終端で再びUにdefineします。
こうすることでコンパイルエラーは出なくなりました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?