• ベストアンサー

VCソースファイルからユーザー定義関数を抜き出す

はじめまして。 VCソースファイル(XXX.cpp)からユーザー定義の関数部分がどれだけあるかを調べたいと考えています。 つまりMFCなどの標準ライブラリー以外がどの程度あるかを調べたいと思いますが、なにか方法はありますでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.3

# 私個人は、MFCから独自に派生するクラスはMFCの定義ではない、 # スケルトンでもWizardでも全部ユーザ定義だと思ってますが、 # (他人はそんなクラスの定義を知らないでしょう?という考え方) # ここでは以後、そういう考え方はしない前提で話を続けます。 > ソースファイル(XXX.cpp)をエディターで開いてみて、 > どの部分がスケルトンで、どの部分がClassWizardで > 作成された部分というのはわかるものでしょうか? 「よく知ってる人」ならわかるでしょう。 # 私でも、主要なスケルトンの生成関数は覚えてますから、見ればわかると思います。 そうでなければ、ソースだけでは多分、完全な特定は無理です。 開発環境があれば、スケルトンか否かは比較簡単にわかると思います。 プロジェクトのタイプはわかりますね?そのタイプで、設定も同じにして、スケルトンを生成してみればいいのです。 ここにあるものだけがスケルトン生成の関数です。diffをとるなり、最後に除外するなりしてください。 ClassWizardの方は、現在のソースから推測するのは骨です。 # 版管理等に記録があれば参考にはなるかも…とはいえ、普通、途中ではcommitしないので期待薄か…。 # まず、Mircosoftのコメントの癖を把握する必要があると思います。 例えば私の例ですが、 Wizardを使うのが面倒で、Wizardが書くのと同じ関数を自分で書いたりすることがあります。 この場合、関数の体裁は一見Wizard製に見えます。 でも、Microsoftの書くコメント(ここに処理を…)などは書かないので、これがあればまぁWizard製だと推測できます。 私はまた、Wizardから実際に生成した関数内の上記コメントが邪魔な場合に削除することもあります。勿論しないこともあります。 # プログラマは多分、そんなコメントに気を配って修正しないと思います。 # (後の保守性に有効なもの以外は無意味なものなので) これから考えると、Wizardのコメントがないものは自作したか、修正したものなので、Microsoftが生成する癖のあるコメントが「ない関数」はいずれもユーザ定義といえます。 ただし、コメントがあるだけではWizard製であることはわかりますが、修正が行われたかがわかりません。これを個別に確認する必要があります。 確認方法としては、同じものをWizardで生成してみて、比較すればわかるでしょう。 # 「よく知っている人」なら生成コードの「癖」も大体わかるので、 # 見れば判断が付くものもあるかもしれません。 ちなみに、目的というか、用途は何ですか? もしかして行数でお値段が決まるとか、そういう話ですか? # 同じものを少ないコードで書くほど、優秀なプログラマ、なら理解できますが。 # なお、私の場合はコードのコピペをしない前提です。 # コメントを含めてコピペしまくったソースの場合は、 # もうわからないと思っていいでしょう。

maseita
質問者

お礼

晩くなりましたが、なんとか解決することができました。非常に、曖昧な質問ばかりで申し訳ありませんでした。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.2

> VCのスケルトン、およびClassWizard(相当)で作成したままの関数は、 > ユーザー定義としませんが、編集したものについてはユーザー定義と考えています。 結局、関数定義の数を数えるので? だとすると、概算でいいなら別ですが、VC6だとプロジェクトの関数表示は正確じゃなかったりすることが多々あります。 (VC7以降で大幅改善してます>IDE) で、「スケルトンやClassWizardで作ったままか否か」を加味したいと。 これは関数の中を見ないと判断できませんね。 方法としてはやっぱり「地道に数えてください」ですかね。 作業工数を突きつけて、そんなものを数えなくて言いように交渉する、とか。 行数だけ数えるなら、スケルトンにClassWizardで同じものだけ足して、diffをとるのが一番らくそうかも。 これで何がうれしいのかよくわかりませんが。

maseita
質問者

補足

早速、アドバイスを頂きありがとうございます。 ソースファイル(XXX.cpp)をエディターで開いてみて、 どの部分がスケルトンで、どの部分がClassWizardで 作成された部分というのはわかるものでしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • MrBan
  • ベストアンサー率53% (331/615)
回答No.1

> つまりMFCなどの標準ライブラリー以外がどの程度あるか > を調べたいと思いますが、なにか方法はありますでしょうか? 具体的に「何の情報がほしいのか」にもよって多少マシになるかもしれませんので、とりあえず補足してください。今の情報では漠然としすぎです。 今の書き込みだけを読むと、こんなアドバイスとか…。 # 多分、簡単な方法はないです。 # 不要なものは除外して欲しいものを数えてください。 # 欲しい情報によっては、ソリューションエクスプローラで数えたり、 # 計測ツールを使ったり、正規表現/文字列解析したりできるかもしれません。 ●VCのバージョンや、プロジェクトの種類などはわかりますか。 > ユーザー定義の関数部分がどれだけあるか ●「関数部分」というのは具体的に何を指しますか。 関数定義(definiton)ですか、関数宣言(declaration)ですか、関数呼出(call)ですか。 ●「どれだけあるか/どの程度あるか」の基準/単位はなんですか。 「数」ですか。「行」ですか。「比率」ですか、母数は何ですか。その他ですか。 > MFCなどの標準ライブラリー ●C/C++の話で標準ライブラリと書くと一般にはMFCは含まないと思いますが(※)、 ここではVisual Studioの付属ライブラリはサードパーティも含め除外対象ということですか。 Win32APIも除外でいいですか。 VCのスケルトンが生成する関数などは、ユーザ定義と分類しますか。 ClassWizard(相当)の生成する関数の方はユーザ定義でよいですか。 ※MFCはMicrosoft社の独自ライブラリで(第三者的な)標準化はされていないため。 「標準ライブラリ」というと、C standard library / Standard Template Libraryを指すことが多い。

maseita
質問者

補足

あまりにも曖昧な質問で申し訳ありません。 まず、VisualC++のバージョンは6.0になります。 VCのスケルトン、およびClassWizard(相当)で作成したままの関数は、ユーザー定義としませんが、編集したものについてはユーザー定義と考えています。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VC++2005であるヘッダファイルを複数のソースから読み込みたいのですが…

    毎度お世話になっています。 現在VC++2005でUSBカメラ画像の処理プログラムを作成しているのですが、 現在こちらのEWCLIBというライブラリを利用しています。 http://www.geocities.jp/in_subaru/ewclib/ このライブラリを 一つのソースファイルからから呼び出した場合問題無いのですが、 複数のソースファイルから呼び出した場合error LINK2005 既に~で定義されています… といったエラーが出てしまいます。 複数のソースファイルからこのライブラリを利用したい場合どのようにすればいいでしょうか? このライブラリは #define EWC_BRIGHTNESS 0 … int ewc_init=0; … int ewc_ncam; … int EWC_GetImage(int num, void *buffer){ … } と単一のヘッダファイルに変数や関数の定義を行っているのですが、 複数のソースファイルからこのライブラリを利用したい場合、やはりヘッダとソースに分割する必要があるのでしょうか? 参考になるページや解決方法等、お伺いしたいです。

  • クラスの関数へユーザー定義型の引数を渡す(VB6.0)

    お世話になります。 クラスモジュール内へ宣言した関数へユーザー定義型(標準モジュール内でPublicで宣言)の引数を渡すとコンパイルエラーとなってしまいます。 ユーザー定義型を宣言した以外の標準モジュールでは同じ関数は動きますが、Formモジュールでは動きません。 標準モジュールにしかユーザー定義型の引数を渡すことは出来ないのでしょうか??

  • 複数ファイルから同じ関数の呼び出しできますか?

    今、クライアント・サーバーのプログラムを作っているのですが、クライアントとサーバの間の通信を暗号化しようとしています。 開発環境はVisualStudio2010のMFCを使っています。 サーバとクライアントのプログラムとを同一のプロジェクトにして、サーバとクライアントの起動をオプションで切り分けています。 しかし暗号モジュールは一つのファイルなので、これをp1.cppとしましょう。 サーバのファイルをmain.cpp クライアントをsub.cpp として、main.cppの方で#include "p1.cpp"とやっても、クライアントのソースからは関数が参照できません。 例えば g++ main.cpp sub.cpp として、両方に同じ関数を書くと2重定義になります。 クライアントのsub.cpp にも同じようにインクルードしてやると、再定義されてるとリンクエラーが出ます。どうすれば同じ関数を同一プロジェクト内で共有(他のファイルから参照)させることができますでしょうか? 解決法をよろしくお願いします。

  • ユーザー定義関数について質問します。

    他社からもらったエクセルファイルにユーザー定義関数が埋め込まれていました。 これが非常に使いやすく便利なのです。しかし、一部を修正したいところがあるのですが「ユーザー定義関数」について知識がありません。 勉強しようと思ってますが、とりあえずこの関数の定義内容を見てみたいのですが、どうすれば中身が確認できますか? アドイン関数ではないので関数の定義は当ファイル内にあるはずです。 よろしくお願いします。

  • ユーザー定義関数 アドイン

    ユーザー定義関数をアドインにどうやって保存するのでしょか? また、ユーザー定義関数以外のVBAをアドインに保存できますか?

  • 多重定義が起きている?--lnk2005エラー:VC++

    今つまずいている問題は、VC++2008環境下で、以下のような構造になっているプログラムにおいて、多重定義?されているのでコンパイルが通らないというものです。 ソースコードを載せることは大きすぎてできないので、問題となる部分の記述のみ抽出して書きます。 -------define.h---------- ・・・・(module.h内の関数に使われる型の定義など) --------------------------- -------module.h---------- #include "define.h" void mod_1(void){・・・} void mod_2(void){・・・} --------------------------- このように、2つのヘッダーファイルがあり、define.hをインクルードしてmodule.hを使うという構造です。 (一般的ではないようですが、module.h内にmod_1やmod_2の実体を書き込んでいます。) その中で、以下のようなcppソースファイルがあります。 -------Main.cpp---------- #include "module.h"   (他のMain.cpp内の関数の都合上、Main.cppでもmodule.hをインクルードしています。関係あるかもしれないと思い書きました。) int main(){ M(); N(); } ------------------------ -------M.cpp---------- #include "module.h" void M(void){ mod_1(); mod_2(); } ---------------------- -------N.cpp---------- #include "module.h" void N(void){ mod_1(); mod_2(); } ---------------------- とすると、コンパイルの結果は次のようになります。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に M.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に M.obj で定義されています。 多重定義や多重インクルードは起こしていないと思っていますが、M.cppとN.cpp内の定義が衝突する理由がわかりません。どなたか理由が思いつく方、教えていただけたら幸いです。お願いいたします!! ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆   ◆◆◆ ちなみに、たとえばMやNとまったく同じ「A.cpp」を作り、このように書いたとします。 -------A.cpp---------- #include "module.h" void A(void){ mod_1(); mod_2(); } ---------------------- そしてmain関数の中に、MやNと同様に『A();』を付け加えたとします。 すると、実行結果はこのようになります。 1>M.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>M.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_1(void)" (?mod_1@@YAXXZ) は既に A.obj で定義されています。 1>N.obj : error LNK2005: "void __cdecl mod_2(void)" (?mod_2@@YAXXZ) は既に A.obj で定義されています。 VC++はファイル名のアルファベット順にコンパイルするようですが、どちらにせよmain関数内で呼び出されていること以外何の関わりも無いはずのA、M、Nの中での出来事が、衝突する理由が、調べども思い当たりません。 お願いいたします。

  • Excelでユーザー定義関数が#NAMEと返される

    EXCELでユーザー定義関数を使用しています。 作成時は問題なく動いていたものの、保存後一度閉じたものを再度開いて数式を更新させると「#NAME」と表示されるエラーが出てしまいます。 関数は標準モジュールで定義しています。 ファイルは.xlsxで作成後、.xlmxにして保存しています。 解決方法をご存じの方がいましたら、ご教授いただければ幸いです。

  • VBAで書いたExcelユーザー定義関数が上手く動きません

    WinXPSP2 Office2003 を使用しています。 プログラムは、本やネットで調べただけの素人です。 具体的には、大量のascファイルにファイル自身の情報をヘッダとして書き込む作業をします。 そのために、ファイルの情報などを返すユーザー定義関数を作り、それを用いた一連の書き込み作業をマクロにして保存し、アドイン化してしまおうと考えました。 作業をマクロにしてアドイン化することはできるようになりましたが、肝心のユーザー定義関数を作るVBAが良くわかりません。 たとえば以下のように、ファイルの作成日時を返すユーザー定義関数を書いて標準モジュールに張ってみたのですが、上手く動きませんでした(具体的には”#VALUE!”になる)。 Function CreationDate() CreationDate = ActiveWorkbook.BuiltinDocumentProperties("Creation Date").Value End Function 次の、ファイルの名前を返すユーザー定義関数は上手く動きました。 Function FileName() As String FileName = Application.ActiveWorkbook.Name End Function なぜ後者が動いて前者が動かないのか、よく理解できません。 どのように変えればよいのか、教えていただけないでしょうか? よろしくお願いします。

  • PHP 設定ファイルとユーザ定義関数

    ある機能を満たすためのライブラリ(lib.php)を作成しました。 このlib.phpはユーザ定義関数の寄せ集めです。 それぞれのユーザ定義関数では、設定ファイル(config.php)に記述されている共通変数を利用します。 このconfig.phpなのですが、ユーザ定義関数ごとにincludeする以外の方法はあるでしょうか? lib.php function one() { $hensu1... $hensu2... ...処理; } function two() { $hensu1... ...処理; } .... config.php $hensu1 = 1; $hensu2 = 2; ... という構成です。 function one,function twoでconfig.phpの変数を利用したいのですが、lib.phpの先頭でinclude "config.php"をしてもfunctionの中では変数のスコープが有効にはならず、 lib.php function one() { include "config.php"; ...処理; } function two() { include "config.php"; ...処理; } としています。 PHP5を使用しています。 function one() { global $hensu1... } としたらよいのでしょうか? どなたかアドバイスいただけますと幸いです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • PostgreSQL(8.4.2)のユーザ定義関数(ストアドプロシージ

    PostgreSQL(8.4.2)のユーザ定義関数(ストアドプロシージャ)を、 ODBC経由でVisualStudio2005から利用したいのですが、 サーバーエクスプローラーからユーザ定義関数を参照することが出来なくて悩んでいます。 ユーザ定義関数はpgAdminIIIで作成しました。 cse(Common SQL Environment)などのフリーのツールからは問題なく参照できます。 VisualStudioにユーザ定義関数として認識させるための何かおまじない的な物が必要なのでしょうか。 それともPostgreSQLとVisualStudioとの相性が悪いのでしょうか。 なおユーザ定義関数以外であるテーブルやビューは、 サーバーエクスプローラーから参照できます。