woshidan's loose leaf

ぼんやり勉強しています

_Pragma演算子と#pragmaディレクティブを使ってObjCで書いたコードの警告を抑制する

仕事で触っているソースコードの中に

#define SOME_WARNING_PROCESS_START _Pragma("clang diagnostic push") _Pragma("clang diagnostic ignored \"-Wpartial-availability\"")
#define SOME_WARNING_PROCESS_END _Pragma("clang diagnostic pop")

のような宣言があって、意味がわからなかったのでメモ。

  • #define ... の部分
    • #define MAGIC_NUMBER 1234 同じ記号定数の定義
  • _Pragma("文字列リテラル")_Pragma はC99で導入された演算子で、#pragma と同じ意味らしい。
  • #pragma は処理系の???
  • clangClang(クラン) のことで、プログラミング言語 C、C++Objective-CObjective-C++ 向けのコンパイラフロントエンド
    • コンパイラは書籍によるそうですが、最適化のための解析 ~ 最適化 ~ 機械語などの生成を担当するバックエンドとプログラミング言語を解釈して最適化を行うための中間表現に仕上げていくフロントエンドに別れているそうです。
    • diagnostic は人間が書いたObjCやCを解釈した段階で出る警告などのこと。処理によっては一時的に無視したい場合もあるので、その場合、 clang diagnostic push / clang diagnostic pop といったPragmaで当該部分を挟む
  • 定数として宣言してあるのは、実際にPragmaを置きたい箇所でいきなり置くより、意味のわかりやすい定数でおいた方が人間が読んでてわかりやすいから?

diagnostic の細かいことや、Pragmaの処理系が~とかいう話はよくわかりませんが、一旦ここまで。

参考