[C++][Qt]Qtのsignals、slotsなどのマクロ名が衝突するとき。

Qtに関する備忘録。

サードパーティーのライブラリなどではsignals、slotsのような名前が何かしら使われていることは珍しくないが、Qtはこれらの名前のマクロを持っているので、採用するライブラリによっては名前の衝突によってコンパイルできなくなることがある。

このような状況のため、Qtはこれらのマクロを無効にするオプションを用意している。

CONFIG += no_keywords

もちろんsignalsslotsemitなどのキーワードは使えなくなるので、自身のソースコード中で用いているこれらのキーワードは以下のように置換する必要がある。

  • signals -> Q_SIGNALS
  • slots -> Q_SLOTS
  • emit -> Q_EMIT

他のビルドシステムを使っている場合は、QT_NO_KEYWORDSというマクロを定義すれば同じ効果を得られる。例えばVisual Studioなら、 "プロパティ->C/C++->プリプロセッサ->プリプロセッサの定義"に追加する。

Q_SIGNALSなどのマクロ名さえ衝突した?知らん、そんな妙竹林な名前を付けるやつが悪い。

……しかしWin32 APIといいQtといい、安直なマクロ名を多用する連中が何故蔓延っているのか理解しかねる。そのせいで何度も涙目になりながらコード修正する羽目になった。