トップページ⇒tech
31コメント10KB

VCとBCの違い

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
いや、同じC++だからとC++Builder から最近VC++を使いはじめました
結構細かいところで 違いありません?
情報を共有しましょう
00021NGNG
なお、
Visual C++ から C++Builder への移行のポイント
http://www.borland.co.jp/cppbuilder/papers/vctocb/index.html

を紹介しておきます
00031NGNG
まず 一つのブロック内に
for(int i;i<10;i++){・・・}
を2つ書いても BC++なら問題ありません。
でもVC++はエラーになります。

{ for(int i;i<10;i++){・・・} }
とさらに全体を括弧で囲む必要があるようです

0004デフォルトの名無しさんNGNG
こういうスレこそ煽られるべきだ。
知ったかぶりもいいところまで逝ってます。
00051NGNG
typedef struct {
void *next;
int size ;
short data[];
} buffer;

こんなふうに、サイズゼロの配列を構造体内で指定するのは BC++では普通に
使っていました。 でも VC++では警告の対象です。
00061NGNG
>>4 しったかぶりと言われるとそうかもしれませんね
   たぶん、何かコンパイルスイッチがあるのでしょう。
0007デフォルトの名無しさんNGNG
「VCとVBの違い」 に、見えた。
00084NGNG
>>6
そんな1に協力しちゃいます(笑)
俺も両方使ってるし。
00091NGNG
今困っているのは、

static const int FSIZE=10;
みたいな 定数での初期化を クラス内に置くのが BC++では問題なく出来たのに
VC++では出来ないようだという事です。

これはどう対処してよいのか判りません。 仕方なくクラス外においていますが・・・
0010デフォルトの名無しさんNGNG
っつーか、全体の構成が具体的に分からないと
なんとも言えん。
0011デフォルトの名無しさんNGNG
>>3 の意味がよくわからん・・。
ホントにエラーになる?
00121NGNG
9のは
 const int クラス名::FSIZE=10;
とクラスの外でやればOKだというのが今判りました。
00131NGNG
>>8

 あ、遅くなりました。よろしくお願いします

>>11

 え? もう一度試してみます。 BCC32で動いてたルーチンを
 そのままコピペしたらこれで引っかかったので間違いないと思うのですが・・・
0014デフォルトの名無しさんNGNG
とりあえずそれぞれバージョンは明示すべきかと。
なんとなくVCが古い規格にしか対応していないようにも見える。
0015デフォルトの名無しさんNGNG
>>11 >>3 のは、
VC++はforの中で宣言した変数のスコープが
for文のブロックの中だけじゃなくて、
そのあとずっと続くので、
2回書くと同じ変数が2回宣言されてる!
というエラーになるのです。
0016>15NGNG
それってC++の仕様じゃなかったっけ?
最近直ったとぷらうが-が言ってたような。
001715NGNG
そのあとずっとというか、外側のスコープのものとして
扱われるのです。だから、for文を{}でくくってやれば
スコープがその中だけになるのです。

だからまぁ、2回iを使うときは2回目は宣言をしないで使う、と。
0018デフォルトの名無しさんNGNG
>>17
やっぱりそういうことだったか・・・。
スコープの特性を使うのも言いが、
面倒や分かりづらくなるなら、
やりやすい様にやった方がええで。
変数名を変えるとかね。普通はそうだと思う。
0019デフォルトの名無しさんNGNG
vc++とc++builderは
全く別物でしょー
0020デフォルトの名無しさんNGNG
forの()内の変数のスコープは、
forの{}の中(BCの動作)になるのが、今のC++の仕様。
forの外側(VCの動作)になるのは、昔のC++の仕様(たしか、ARM第1版ぐらい)。

サイズ0の構造体は処理系依存だったと思う。
>>5の例は、dataを既にalloc済みの可変長メモリとして扱うのは
わかるけど、これが、一般に、structの途中に出てきた場合、
次のメンバとオフセットアドレスを同じにすべきか否かの
判断が処理系依存になる。んじゃないかな(弱い)。

クラス内での定数は、宣言はできても初期化(定義)は別のところで
(VCの動作)ってのが普通(gccも)。
理由は、リンカが困るから。
何回もコンパイルされるヘッダ内にFSIZEの定義があると、
リンクするときに、FSIZEの定義が複数のobj(UNIXなら.o)ファイル
にあるので困る。
Borlandのコンパイラ/リンカは伝統的に優れているので、これを解決
できるけど、他のコンパイラ(VC、gcc、codeworrior、その他)が
できるとは限らない。ので、このような仕様になったのではないか。
と思う。

あと、定数が欲しいのなら、static const intだと、メモリ中に確保
されてしまい(されないと、&演算子でアドレスがとれないから)、
数バイトとはいえ無駄になるので、変数の型等の折り合いがつくのなら
enum { FSIZE=10 };
が定石だと思う。
0021デフォルトの名無しさんNGNG
BCではなく、BCBと略記しましょう。
0022デフォルトの名無しさんNGNG
VC++ のウイザードって コード直接修正したりした後、何か変になりませんか?

C++Builderの場合、無理にコードエクスプローラからメソッドの新規作成とか
しなくても直接書いたり、直接修正しても特に変にならなかったのに・・・
0023デフォルトの名無しさんNGNG
>>22
//{{ と //}} の間をいじらなければなりません。
イベントハンドラ以外のメソッドは全て直接編集してますが、
変になったことはありません。
0024デフォルトの名無しさんNGNG
>>22
お主の作ったバグをVCのせいにするのはどうかと思うが
0025デフォルトの名無しさんNGNG
MicrosoftがMFCを作ったとき、まだC++の仕様が完全に固まってなかったんだよ。
その後いろいろ仕様が策定されたんだけど、Microsoftとしては今更変更するわけに
いかなくなってしまったんだよ。
だから、VisualC++の初期状態では、ANSI互換でない部分もある。
設定で互換にできるものも多いけど、そうなるとMFCを捨てる必要が出てくるかもしれない。

ところでC++にはANSIという標準があるわけで、
VCとBC(BCB?)を直接比較するよりも、
お互いがどれだけANSI準拠・非準拠なのを調べたほうが建設的だと思う。
0026デフォルトの名無しさんNGNG
>>25
>お互いがどれだけANSI準拠・非準拠なのを調べたほうが建設的だと思う
そのほうが意味ないと思うが

VCとBCBの最大の違いはアカデミックパックの値段の違いだろう
たかすぎるぞBCB
0027デフォルトの名無しさんNGNG
>>26
M$は開発ツールで儲ける必要ないだろ。公正取引委員会US版が
黙認すれば、studioの無料配布。で、ボーランドは潰れるだろう(w
ブラウザ戦争も今は昔となりました。 価格競争は厳しいねぇ。
002826NGNG
>>27
思うんだがVCのアカデミックパックはべらぼーに安い
BCBはそれよりも高い
普通の金のない学生はどうしてもVCを買う
若者に見向きされないBCBは消え去るのみ
0029デフォルトの名無しさんNGNG
実際、いくらくらい違う?
0030デフォルトの名無しさんNGNG
学生のときにstudio買ったよ。
enterprise版が3万円台中盤だったと思う。
馬鹿らしくてVC単品とかstanderd版とか買う気起きなかったよ。

今は就職しちゃったのでアカデミックは買えないが、
.NETはいくらするんだろう……
0031デフォルトの名無しさんNGNG
BCB / BC の math.hには M_PI M_E M_SQRT2
が定義されているが VCには定義されていない

共用する場合は自前で定義しておく事
■ このスレッドは過去ログ倉庫に格納されています