2015年4月25日 星期六

#ifdef、#elif、defined

 最近因為想把用Open GL的程式放到OS X跑,把Preprocessor #include的部分改為

#ifdef _WIN32
...
#elif __APPLE__
#include
...
#endif

後來感覺#elif部分怪怪,查了一下,發現#ifdef其實是#if defined的方便寫法,而原本的#elif部分並不是檢查有無define,而是做條件判斷。

隨便寫個C++程式測試:

...
#ifdef NOT_DEFINED
...
#elif ALSO_NOT_DEFINED
  std::cout << "print for test" << std::endl;
...

可編譯,不輸出


...
#define DEFINED

...
#elif DEFINE
  std::cout << "print for test" << std::endl;
...

無法編譯,"error: expected value in expression"


...
#define DEFINED_AS_ZERO 0

...
#elif DEFINED_AS_ZERO
  std::cout << "print for test" << std::endl;
...

可編譯,不輸出


...
#define DEFINED_AS_ONE 1

...
#elif DEFINED_AS_ONE
  std::cout << "print for test" << std::endl;
...

可編譯,有輸出


改用#elif defined,皆可編譯,除ALSO_NOT_DEFINED外皆有輸出


白目想說cout __APPLE__看看,輸出1,無怪乎原本用#elif也能順利include。但#elif define(__APPLE__)感覺較良好,還是改吧。

沒有留言:

張貼留言