
以下のコードを見ると、たとえば の c または c++ ファイルを、main.cpp
前処理後の状態 ( ) に変換するだけですmain_pp.cpp
。
ただし、生成されたコマンドを実行すると、g++ -E "main.cpp" > "main_pp.cpp"
コマンド ラインで問題なく動作します。
正確なエラーは なので、 が引数リストの一部ではないg++: error: >: Invalid argument
ことを認識していないようです。>
cd "$(CURRENT_DIRECTORY)"
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
NppExec の動作が標準のコマンドラインと異なる理由を知っている人はいますか?
答え1
出力リダイレクト>
とパイプは、|
コマンドラインインタープリタが担当します。Windowsでは、cmd.exe
コマンドラインインタープリタは、
g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
これを使って:
cmd /C g++ -E "$(FILE_NAME)" > "$(NAME_PART)_pp$(EXT_PART)"
答え2
簡単に答えると、コマンド ライン インタープリターは他のプログラムを実行するだけでなく、プログラムの出力をリダイレクトしたり>
、出力をパイプしたりするなどの|
機能はコマンド ライン インタープリターによって提供されるため、NppExec が機能するにはそれをシミュレートする必要があります。
より正確な答えは、Windowsで新しいプロセスを開始するには通常、CreateProcess()
および関連関数は、新しいプロセスの出力をリダイレクトできますが、を使用するほど簡単ではありません>
。ハンドルを開くファイルにそれを渡しますSTARTUPINFOA
適切なフラグを使用します。
したがって、リダイレクトをサポートするには、>
NppExec は行を解析してその部分をアプリケーションとパラメータから分離する必要がありますが、これは難しい場合があります。また、プリンタなど、ファイル以外のものにリダイレクトできることも考慮する必要があります。
不可能ではありません。あなたの例では、cd
コマンドラインインタープリタによっても提供されるものを使用しているため、NppExec は基本的な解析を行っているようです。しかし、これは、行の最初の 2 つのスペース以外の文字が "cd" であるかどうかを確認し、行の残りの部分を使用して変更するだけの簡単なものです。現在のディレクトリ。
また、NppExec は、アプリケーションとパラメータを分離するための行を解析すらしていないのではないかと思います。変数を置き換え、CreateProcess()
アプリケーション パラメータを省略できるという事実を利用して、行全体をコマンド ライン パラメータとして渡すことができるだけだと思います (少なくとも、私ならそうします :-)。
最後に、結果をファイルにリダイレクトするか、別のプログラムにパイプすることを想定して標準出力に結果を出力するだけのプログラムは、Unix/Linux でより一般的です (g++ は、もともと Unix 用に作成された GNU の一部であるようです)。Windows では、出力ファイルを指定するためにパラメータを使用するのが一般的であるため、「Linux スタイル」のプログラムを使用しない場合は、リダイレクトのサポートは最優先事項とは考えられません (または、そもそも考えることもありません)。