2013年1月27日日曜日

use `true` if you are C++er

GLFWのC++ラッパーライブラリーlibWRP-GLFWを必要に応じて少しずつ整理しています。

libWRP-GLFWをのほほんと#includeして GL_TRUE とかユーザーコード中で使うと翻訳時エラーで止まります(╹◡╹)

src/test.cxx:49:46: error: static assertion failed: use `true` if you are C++er

こんな風に。

いまどきC++erがBOOLとかTRUEとかFALSEとかGL_TRUEとかGL_FALSEとか、そんなダサいコード書けませんよね。書いてあったとしても何かの間違いです。エラーです。

これはライブラリー側でどうしているとかと言うと、

#ifdef GL_TRUE
  #undef GL_TRUE
  #define GL_TRUE []{static_assert(false, "use `true` if you are C++er"); return true; }()
#endif

こんな事になっています。static_assertだけをGL_TRUE#defineしてしまうと大抵の使われどころで周辺の構文を破壊してしまいエラーメッセージが意味不明になります。そこでラムダ式に封入しつつその場で呼び出させstatic_assertにより翻訳時エラーにしています。

GLFWはCのライブラリーなので、そのままではGL_TRUEやGL_FALSEが有るのも、よーしぱぱC89でOpenGLを使っちゃいたいぞーなんて人用に仕方がないのかなー、そもそもlibGLで使っちゃってるものだしなー・・・(´・ω・`)

と、そんな事情もあるものと思いますが、C++03やC++11のC互換性のもとC99ではbool型が言語組み込みで使えますから、その世界でBOOLとかTRUEとかFALSEとかGL_TRUEとかGL_FALSEとか使うだなんてこっ恥ずかしくてやってられないレベルですよね。 魔王「この世界に魔法など存在しない!」  くらいに(╹◡╹)

さておき、今回紹介した様なちょっと過激な使い道はさておくにしても、この様な方法も知っていると役に立つこともあるかもしれませんね。attributeでdeprecatedだと通常は警告止まりですし関数が対象だったりしますし。

0 件のコメント:

コメントを投稿