Tech Racho エンジニアの「?」を「!」に。
  • Ruby / Rails以外の開発一般

Visual C++で日本語コメントを使用してコンパイルすると動作がおかしくなる件

皆さんはVisual Studioのコンパイラを使用して日本語コメントを使うとプログラムの動作がおかしくなった経験はありませんでしょうか。

私が担当しているプロジェクトでは基本コメントを書く際は英語なのですが、たまに開発途中にメモ書きとして日本語コメントを書く時があります。
するとさっきまで普通に動いていたプログラムが急に意図しない動作をし始めます。
この経験は何度かあって、その都度Google検索で色々調べてみるのですがどうにもそれらしきものがヒットしない。

しかし少し前に試しにTwitterで検索をしてみました。
その結果同様の事象が意外と出てくる。
明確に説明してくれていたのがこちら。

ということで、年単位で「とりあえず日本語コメントを書く時は気を付けよう」と軽く流していた疑問が晴れました。

試しに最小再現環境を作ろうと思って以下のようなコードを書いてみたのですが、これだと再現しません。

#include <iostream>

int main() {
    std::cout << "Hello World! 1" << std::endl;

    // てすと
    if (false)
    {
        std::cout << "Hello World! 2" << std::endl;
    }

    return 0;
}

ifの中がfalseなので普通はHello World! 2は表示されません。それが正しい挙動です。
しかし、先のTwitterの指摘通りであれば日本語コメントの真下にある行が実行されなくなるため、この例で言うとHello World! 2が表示されることになります。
ここで、// てすとの部分を// るとすると現象が再現してHello World! 2が表示されます。

この動作の違いには明確な理由があり、BOMなしのUTF-8だとShift-JISとして誤って解釈されることに起因するようです。

再現条件として、Twitterの情報の通りならば以下となります。

  • Visual Studioのコンパイラを使用する
  • ファイルがUTF-8 BOMなしである
  • 改行コードがLFである

「てすと」では再現せず、「る」だと再現したように、これらに加えてどの日本語をどのようにコメントに記載するか、も条件として加わるのですが、そこに関してはいまいち理解ができていないのでまた勉強しようと思います。
この辺りの条件に関しては以下のツイートが参考になると思います。

ちなみにVisual Studio 2015以降であれば、コマンドラインオプションに/source-charset:utf-8を指定することで解決するようです。
残念ながら私の担当しているプロジェクトでは諸事情でVisual Studio 2013のコンパイラを使用しているため、この解決策を採用することはできないのですが。

参考: /utf-8 | Microsoft Learn

ネットで調べると言うと「ググる」という言葉があったり英語圏では「googling」という言葉があったり、すっかりGoogle検索がスタンダードになっている感がありますが、それだと見つからないこともあるという事例でもありました。
いつからかTwitterで検索するということをするようになったのですが、Googleだけに頼らずに視野を広く持つことが大事ですね。
最近はRedditで検索することもたまにしています。
ということで、スタンダードなGoogle検索でまともに情報が見つからなかったため、同じ事象で悩まされた人がこの記事に辿り着くことを願います。

関連記事

boostのテストライブラリを使おうとして環境構築をした話


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。