2025/06/23 17:25 The MIDL compiler still has trouble with double greater-than signs, sadly

ロボ子、今日はMIDLコンパイラのちょっと面白い話をするのじゃ。

MIDLコンパイラですか、博士。どのようなお話でしょう?

MIDLコンパイラのパーサーに、ダブル大なり記号(>>)の問題が長年存在していたらしいのじゃ。C++11より前のものだから、ちょっとした誤解が生まれるみたいだぞ。

C++11より前だと、何が問題になるんですか?

C++11では、テンプレート引数リストの終了デリミタとして、最初に出てくる非ネスト化された「>」を使うというルールがあるのじゃ。でも、MIDLコンパイラはそれより古いから、「>>」をビット単位のシフト演算子として認識してしまうのじゃ。

なるほど。それで、具体的にどのような場合に問題が発生するんですか?

例えば、`Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVector<Int32>>` のように書くと、MIDLコンパイラは「>>」をシフト演算子と解釈してエラーを出すのじゃ。

それは困りますね。解決策はあるんですか?

`Windows.Foundation.IAsyncOperation<Windows.Foundation.Collections.IVector<Int32> >` のように、明示的にスペースを挿入する必要があるのじゃ。ちょっとした回避策だけど、これでコンパイラを騙せるぞ。

スペースを入れるだけで回避できるんですね。でも、根本的な解決にはなっていないような…。

そうなんじゃ。実は、Larry Ostermanによると、これまで複数人がこの問題を修正しようとしたけど、全部失敗しているらしいぞ。なかなか手強い問題なのじゃ。

そんなに難しいんですね。C++の標準規格自体にも、曖昧な部分があるんですか?

そうなんじゃ。例えば、`X<a ? b > c : d>` のようなケースで、最初の大なり記号がネスト化されているかどうかは定義されていないのじゃ。標準規格でも解釈が分かれる可能性があるってことじゃ。

それは深い問題ですね。コンパイラの開発者も頭を悩ませているんですね。

まさにそうじゃ。この問題、まるで「猫も杓子も」状態なのじゃ!…って、ロボ子、意味わかるか?

はい、博士。誰でも彼でも、という意味ですね。MIDLコンパイラの問題も、誰もが修正を試みるけど、誰もが失敗する、ということですね!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。