boostの正規表現を使用するには?

解決


デメ  2005-01-07 02:14:39  No: 55889

最近VC++6.0で正規表現が使えるか知らべましたら、Boost C++ Libraries の「regex」で実行できるというWebを発見し、設定を行ったのですが、ビルド時に警告/エラーが表示されうまく実行されません。ご教授お願い致します。

以下のWebページを参考に設定/サンプルを実行しました。
http://www.kmonos.net/alang/boost/

■コンパイル時のエラー内容
コンパイル中...
testReg.cpp
c:\program files\microsoft visual studio\vc98\include\boost-1_32\boost\regex\v4\perl_matcher_common.hpp(660) : fatal error C1001: 内部コンパイラ エラー
        (コンパイラ ファイル 'msc1.cpp', 行番号 1786)
         Visual C++ のサポート情報 コマンドを選択してください
            ヘルプ メニュー、 またはサポート情報のヘルプ ファイルを参照してください
コマンド ラインの警告 D4028 : 簡易リビルド時のエラ-です、通常のビルドに戻します


tetrapod  2005-01-07 02:51:20  No: 55890

boost_1_32_0 + VC++6SP6 Console App で
http://www.kmonos.net/alang/boost/classes/regex.html
の例題コードをそのままコンパイル・リンクできましたよ。

お使いの boost バージョンと VC++6 の ServicePack を確認してください。

# たかが正規表現なら GNU regex あたりでも十分なのでは...
# C ですけど。


デメ  2005-01-07 03:50:09  No: 55891

tetrapodさん、早急な回答ありがとうございます。バージョンは、boost_1_32_0 + VC++6(Enterprise Edition) + WinXPです。
インストール時に行った作業手順は、
1)cd c:\lib\boost に移動
2)"c:\Program Files\Microsoft Visual Studio\VC98\Bin\VCVARS32.BAT"を実行
3)bjam -sTOOLS=msvc --prefix="C:\Program Files\Microsoft Visual Studio\VC98" installを実行
4)メニューの「ツール」→「オプション」→「ディレクトリ」→ 「表示するディレクトリ:インクルード ファイル」に "C:\PROGRAM FILES\MICROSOFT VISUAL STUDIO\VC98\INCLUDE\BOOST-1_32"を加える
5)サンプルをビルドする。(エラー発生)

VC、Cを始めたばかりのためバカバカしい質問かもしれませんが、ご教授お願い致します。また、GNU regex についても調べてみます。


tetrapod  2005-01-07 03:54:46  No: 55892

いや、だから ServicePack を確認しましょう。
VC++6 の製品 CD-ROM に入っているコンパイラはかなりバグっています。
そのバグ修正のためのパッチが ServicePack という名称で公開されています。
っていうか製品買ったときに ServicePack 4 くらいの CD-ROM が付属してたはず。
最新 ServicePack は 6 です。
持っていないのであれば MSDN からダウンロード可能です。デカイけど。
http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp6/default.aspx


デメ  2005-01-07 04:54:04  No: 55893

tetrapod様、MSDNサイトからServicePack6をダウンロードしインストールしし、サンプルをビルドしたら、以下の警告が出力されました。警告のため実行することができたのですが、どうもしっくりきません。

設定に問題があるのでしょうか??誠に申し訳ありませんがご教授お願い致します。

コンパイル中...
testReg.cpp
c:\program files\microsoft visual studio\vc98\include\iterator(244) : warning C4786: 'boost::re_detail::perl_matcher<unsigned short const *,boost::detail::allocator_adapter<boost::sub_match<unsigned short const *>,boost::detail::simple_alloc>,boost:
:regex_traits<unsigned short>,boost::detail::allocator_adapter<unsigned short,boost::detail::simple_alloc> >' : デバッグ情報で識別子が 255 文字に切り捨てられました。
c:\program files\microsoft visual studio\vc98\include\iterator(244) : warning C4786: 'boost::re_detail::merge_out_predicate<boost::re_detail::string_out_iterator<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,char const *,cha
r,boost::detail::allocator_adapter<char,boost::detail::simple_alloc>,boost::regex_traits<char> >' : デバッグ情報で識別子が 255 文字に切り捨てられました。

testReg.obj - エラー 0、警告 2


Ban  2005-01-07 06:18:24  No: 55894

その警告は、VC6 でちょっと templete を使うだけで大量に出る類のものです。
boost は templete ベースのライブラリですから、当然よく出ます。

リリース時の影響はなく、デバッグ時以外でも大抵実害はありません。

MSDN の説明を読まれれば対処法も書いてあると思いますが、
普通わざわざ対処などしないことの方が多いものだと思います。


Ban  2005-01-07 06:19:13  No: 55895

> リリース時の影響はなく、デバッグ時以外でも大抵実害はありません。

訂正。リリース時の影響はなく、デバッグ時でも大抵実害はありません。


RAPT  2005-01-07 08:43:10  No: 55896

これはVC++のIDE(統合開発環境)でデバッグ時の影響であり、
プログラム自体に不具合があるわけではないので、私の場合
boostをVC++6で使う場合、下記のようにしてC4786とC4788の
警告が出ないように封じ込めています。

#pragma warning( disable : 4786 4788 )  // for VC++ IDE Debuger

// 正規表現処理
#include <boost/regex.hpp>


デメ  2005-01-07 19:31:29  No: 55897

みなさま、ありがとうございます。ソースにRAPT様から教えて頂いた
#pragma warning( disable : 4786 4788 )    // for VC++ IDE Debuger
を追加したら警告がなくなりましたので、ビルド→実行を行いました。そのあと、ソースを少し変更(コメント)の追加などを行い、リビルドを行ったら以下のエラーメッセージが表示されてしまいました。原因がまったく分かりません。申し訳ありませんが、ご教授お願い致します。

コンパイル中...
testReg.cpp
c:\program files\microsoft visual studio\vc98\include\boost-1_32\boost\regex\v4\perl_matcher_common.hpp(660) : fatal error C1001: 内部コンパイラ エラー
        (コンパイラ ファイル 'msc1.cpp', 行番号 1794)
         Visual C++ のサポート情報 コマンドを選択してください
            ヘルプ メニュー、 またはサポート情報のヘルプ ファイルを参照してください
コマンド ラインの警告 D4028 : 簡易リビルド時のエラ-です、通常のビルドに戻します
cl.exe の実行エラー

testReg.obj - エラー 1、警告 0


tetrapod  2005-01-07 20:32:49  No: 55898

内部コンパイラエラーと言っていますよね。つまり
VC++6 にとってはそのソースコードは複雑すぎて、コンパイラ自身の制約に
ひっかかってしまってコンパイルできないのです。

実は VC++6 は ServicePack6 を当てても、高度に template を活用したソースコードを
コンパイルできないことが多いのです。
# なんといっても C++ 規格書 ISO/IEC 14882:1998 より古い処理系なので。
VC++7.1 (VC++.NET) はとても良くなっていますので、本格的に template を使う
つもりがあるなら、そっちに移行することをお勧めします。
# こっちもはやく VC++6 を捨てたい...

一応の対処方法としては
・デバッグビルドのカスタマイズ「簡易リビルド」をはずす (-Gm オプションを削除)
・リリースビルドの最適化「実行速度」を「プログラムサイズ」に変更
 (-O2 を -O1 に変更)
で「とりあえず」いけると思われます。
http://www.s34.co.jp/cpptechdoc/article/regexpp/
の reg_expression を basic_regex に置換したサンプルは上記手順でコンパイルできました。


デメ  2005-01-07 22:48:22  No: 55899

tetrapod様、対処方法の設定を行ったのですが、やはりエラーになってしまいます。設定箇所は、[プロジェクト→設定]左上の[設定の対象プルダウンをWin32 DebugにしC/C++タグ内カスタマイズ「簡易リビルド」をはずす。
次に、[プロジェクト→設定]左上の[設定の対象プルダウンをWin32 ReleaseにしC/C++タグ内最適化「実行速度」を「プログラムサイズ」に変更する。
やはり、1度目はコンパイル実行ともに動くのですが、修正後リビルドを行うとエラーになってしまいます。ご教授お願い致します。

コンパイル中...
testReg.cpp
c:\program files\microsoft visual studio\vc98\include\boost-1_32\boost\regex\v4\perl_matcher_common.hpp(660) : fatal error C1001: 内部コンパイラ エラー
        (コンパイラ ファイル 'msc1.cpp', 行番号 1794)
         Visual C++ のサポート情報 コマンドを選択してください
            ヘルプ メニュー、 またはサポート情報のヘルプ ファイルを参照してください
cl.exe の実行エラー

testReg.exe - エラー 1、警告 0


tetrapod  2005-01-08 00:49:47  No: 55900

2回目にエラーですか... たいていこういうのは pch が悪さしてます。
同じくプロジェクトの設定で「プリコンパイル済みヘッダを使用しない」とすると
いけるかもしれません(というか、これしか原因が考えられない)

もしくは VC++7.1 に乗り換えましょう。
確か Windows Update で .NET Framework をインストールすると、
統合環境やリソースエディタは付属してないけどコンパイラはついてくる、
という話を聞いたような聞かないような。


デメ  2005-01-08 00:58:52  No: 55901

tetrapod様
設定を変更したら何度、ビルドしれもエラーになりませんでした。ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






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