C++ で記述されたアプリケーションを Windows から Linux に移植しています。ヘッダー ファイルのパスに問題があります。Windows は を使用し\
、Linux は を使用します/
。すべてのソース ファイルとヘッダー ファイルでこれを変更するのは面倒です。回避策はありますか?
6 に答える
#include パスでは常にスラッシュを使用してください。基礎となる OS がサポートするスラッシュ/ディレクトリ スキームにパスをマップするのは、コンパイラの仕事です。
あなたたち! はい、常にスラッシュを使用できますし、使用する必要があります。ここからどうやって行くかが問題だと思います!
Perl がインストールされている場合、次の 1 つのライナーは C++ ソース ファイルをスラッシュを使用するように変換し、元のバージョンを拡張子 のファイルに保存します.bak
。
perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" myfile.cpp
(上記のコマンド ラインは Windows 用です。Linux またはその他の Unix ライクなシェルを使用している場合は、3 番目のパラメーターを二重引用符ではなく単一引用符で囲みます。)
変換する必要があるファイルがたくさんある場合は、すべてのファイルの末尾を次のように言います.cpp
。
for %f in (*.cpp) do perl -i.bak -pe "tr!\\!/! if /^\s*#\s*include\b/" %f
Bourne シェル環境 (典型的な Linux シェル) に対応するコマンド:
for f in *.cpp; do perl -i.bak -pe 'tr!\\!/! if /^\s*#\s*include\b/' $f; done
Perl がインストールされていない場合は、複数のファイルを検索および置換できるテキスト エディターを見つけることができるはずです。
Windows API は、ディレクトリ セパレータとして常にスラッシュをサポートしています。それは、少なくとも DOS 3.1 まではサポートされていたからです。問題は常に COMMAND.COM と CMD.EXE でした。オプション インジケータとしてスラッシュを使用します (Unix に見られるようなダッシュの代わりに)。特殊文字をエスケープするために文字列内のバックスラッシュが使用されている言語では、ディレクトリ セパレーターにバックスラッシュを決して使用しないでください。
Unix シェルがない場合、複数のファイルを検索/置換するエディターを持っていませんか? 必要に応じて、それを行うための小さなプログラムを作成してください。#include ステートメントの C++ ソース コードを解析することは難しくありません。
#include ディレクティブでは常にスラッシュを使用してください。一部のオペレーティング システム / コンパイラはそれを必要とし、Windows / Visual Studio はそれを正しく処理するのに十分スマートです。
Windows コードから始めたので、Visual Studio をお持ちだと思います。検索と置換ダイアログを使用して、置換を行う正規表現を作成します。すべてのファイルに対して検索と置換を実行します。
たとえば、次のようなものを使用します。
#include:b+<{[^\\\>]}\\
検索式と
#include <\1
置換式 (警告: 未テスト)。置換が行われなくなるまで、すべてのファイルに対してこれを実行します。次に、山括弧を引用符に切り替えて繰り返します。
使用している Windows のバージョンは何ですか? 私の知る限り、Windows XP 以降では、スラッシュは実際にパスの区切り記号として機能します。