BLOGTIMES
2014/06/16

scanf_s() や gets_s() が入ったソースを gcc で無理やりコンパイルする

  c  windows 
このエントリーをはてなブックマークに追加

最近、 VC++ で書かれたプログラムをコンパイルして評価するということをひたすら繰り返しています。

初学者のプログラムなので Linux / gcc でも評価には差し支えないだろうということで、簡単なテストドライバを書いて自動化してみました。これで手間も減って楽ちんと思っていたら・・・いくつかコンパイルができないソースが見つかってしまいました。プログラムの詳細を確認してみると、scanf_s() や gets_s() といった見慣れない関数が入っています。この _s がついた関数は何なのかと思って調べてみたところ、少し安全になった ( secure ) という意味の MS 独自実装のようです。

ひとまず、gets_s() の方は gets() に読み替えてやればよいので、プリプロセッサを使ってこんな感じのマクロで回避できました。

#define gets_s(s) gets(s)

問題は scanf_s() の方です。scanf_s() は可変長引数なので、単純にマクロがかけません。かくなる上は scanf_s を scanf に文字列置換をかけてしまおうかと思いましたが、いろいろ調べてみたところ __VA_ARGS__ という可変長引数をマクロで使うための機能*1 が用意されていたので、これを使って下記のように定義することができました。

#define scanf_s(fmt, ... ) scanf(fmt, __VA_ARGS__ )

限界はありそうですが、これはいろいろ使えそうですね。


トラックバックについて
Trackback URL:
お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6790
Trackbacks
このエントリにトラックバックはありません
Comments
愛のあるツッコミをお気軽にどうぞ。[policy]
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントはありません
Comments Form

コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。

OpenID を使ってログインすることができます。

Identity URL: Yahoo! JAPAN IDでログイン