timespec_get()はmacOSには実装されていなかった

私が調べた情報のまとめなので間違いがあるかもしれません

経緯

大学のCの授業でゲームを作る最終課題が出されました。

ゲームを作りにあたり、時間を測定する処理が必要になります。 そのため、UnixでもWindowsでも使える時間計測関数のサンプルコードが授業で配布されました。 しかし、そのコード内で使用されている関数 gettimeofday() が非推奨になっていることを知り、代替の関数を使うように書き換えようとしました。

www.mm2d.net

timespec_get() を使いたかった

私はmacOS上でプログラミングをしています。また、コンパイラは gcc を使っていました。

このページによると、C11timespec_get() という関数が追加されたようです。

そこで、 gcc でコンパイルする際に、 -std=c11 オプションを付ければこの関数を使えるのではないかと考えました。 しかし以下のようなwarningとerrorが表示されてしまいました。

warning: implicit declaration of function
      'timespec_get' is invalid in C99 [-Wimplicit-function-declaration]
error: use of undeclared identifier
      'TIME_UTC'

C11 を指定したのに invalid in C99 はよくわかりませんが、-v を付けて確認してみると -std=gnu11 オプションが付いてコンパイルされているので、 C11 でコンパイルされているようです。

わからなくなってきたなぁと思いつつ、 implicit declaration of function の意味を調べてみると、 関数の暗黙の宣言 が問題なようです。 もしやと思い 、 time.h を見てみると、 timespec_get() のプロトタイプ宣言がありませんでした。

そりゃあダメじゃん!!

ということで調べてみると以下のページを見つけました。

stackoverflow.com

macOSには timespec_get() は実装されていないという回答でした。

そういえば最初に挙げたページにも、

C言語標準ではあるが C11(ISO/IEC 9899:2011) という新しい標準で追加されたもののため、 使用できる環境はある程度限られる点に注意していほしい。

と書かれていました。


ということで、 timespec_get() はmacOSには実装されていなかったというお話でした。