Cで記述されたプログラムがあります。
これをVC++に移行して、DLLを作成しようと考えていますが、
単純に写せばうまくいくのでしょうか?
何か注意点があれば、教えていただきたいのですが。。。
ここを参考にどうぞ
http://rararahp.cool.ne.jp/vc/vctips/candcpp.htm
(らららのお部屋−C言語で書かれた関数をC++から呼び出す)
> VC++ に移行して
コンパイラの変更だけ(言語はCのまま)ですか。言語の変更(C++ に移植)ですか。
そして、既存の C はどの環境用でしょうか。
DLL は C でも書けます。
元が UNIX など特定の別環境に依存しないなら、
注意点は DllMain と定義ファイルくらいかな。
Blueさん。ありがとうございました。参考にさせていただきます。
>コンパイラの変更だけ(言語はCのまま)ですか。言語の変更(C++ に移植)ですか。
C++に移植することを考えています。
>そして、既存の C はどの環境用でしょうか。
環境は・・・このEXEがWindows2000Serverで動いてますので、Windows用でいいのかな?初心者で申し訳ありません。
>単純に写せばうまくいくのでしょうか?
>C++に移植することを考えています。
基本的にはほぼそのままで上手くいきますが、
C++はCの完全上位互換ではないので、修正が必要な場合があります。
型の判断が厳格になったので、キャストが必要だと言われることが多いです。
(特にポインタ周り)
例えば、
int *p = malloc(100 * sizeof(int);
これは C言語では正しいが、C++言語ではNG。
int *p = (int *)malloc(100 * sizeof(int);
とする必要がある。
厳密には
int *p = reinterpret_cast<int *>(malloc(100 * sizeof(int));
か。
それから、CRTを使うか、APIを使うか、など。
# strlen(CRT) か lstrlen(API) か、ということ。
# > int *p = (int *)malloc(100 * sizeof(int);
# 括弧が合ってない....ってのは野暮な突っ込み....。
> int *p = reinterpret_cast<int *>(malloc(100 * sizeof(int));
void* からその他の型のポインタに対するキャストは static_cast です。
でも、やはりこちらを推奨。(std::bad_alloc は適切に catch してください)
int* p = new int[100];
> それから、CRTを使うか、APIを使うか、など。
これは、既存 Win32 -> Win32 の移植ならあまり関係ないような。
どちらも I/F は C 互換ですし、C++ から C の処理は呼べるわけで、
原則現状維持でOKでしょう。
# ちなみに、想定されている「移行」というのは、
# 再コンパイル+小修正程度であって、再設計ではないんですよね。
# STL やら MFC やら、はては ATL やらを前提に、OOPで再設計するなら
# 話はだいぶ違うと思いますが。
皆様ありがとうございます。
もう一点、超初心者質問させていただきたいのですが・・・
VC++6.0のSource Fileに既存の「〜.c」ファイルをインポートして、ビルドしました。よくわからないエラーが出ています・・・
そもそも、こんなやり方でいいのでしょうか?
「〜.c」のソースコードを丸々「〜.cpp」にコピーしたほうが方法として妥当なのかな???
調べたのですが、そこがわかっていないので、大変申し訳ございませんがご教授お願いいたします。
>よくわからないエラーが出ています・・・
そのエラーを提示してくれなければだれもわかりません。
>「〜.c」のソースコードを丸々「〜.cpp」にコピーしたほうが方法として妥当なのかな???
時と場合によるとおもいますが。
失礼しました。
--------------------------------------------------------------
warning C4005: 'prefname' : マクロが再定義されました。
'prefname' の前の定義を確認してください
プリコンパイル済みヘッダーの検索中に予期しない EOF を検出しました。
--------------------------------------------------------------
今出ているエラーは以上です。。。
拡張子はプログラマの先入観で誤認させないためには結構重要だと思いますが、
VC としてはオプションで言語が C++ になっていれば .c でも .cpp でも変わらないはず。
>>よくわからないエラーが出ています・・・
最初から C++ を意識していたか、(ある種病的なほどに)お行儀のいいコードでもない限り、
ある程度以上の規模がある C のコードなら、無修正で C++ で通ることは稀だと思います。
そのままで通るなんて幻想...っていうか危険なコードが通ったら C++ の旨みがないです。
まぁそんなものだということで。
# 更新したら書き込みが。
とりあえず、以前のコンパイラは何ですか?
#include "stdafx.h"
とかいう"呪文"が先頭に書かれてないソースなら、
VC のオプションで「プリコンパイルヘッダを使用しない」にするといいかも。
# もしくは、単に同一マクロの多重定義かもしれませんけど。
できた
ツイート | ![]() |