[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 01/02 08:18 / Filesize : 209 KB / Number-of Response : 862
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

C++相談室 part62



1 名前:デフォルトの名無しさん mailto:sage [2008/05/27(火) 23:53:59 ]
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレに
お願いします。

前スレ
C++相談室 part61
pc11.2ch.net/test/read.cgi/tech/1205059063/

552 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 11:05:57 ]
>>550
fork → UNIX/Linux系のシステムコールで環境依存
printf → C言語
【初心者歓迎】C/C++室 Ver.55【環境依存OK】
pc11.2ch.net/test/read.cgi/tech/1213466622/l50

>そんな課題
C/C++の宿題を片付けます 111代目
pc11.2ch.net/test/read.cgi/tech/1214563642/l50

>解説して
www.google.com/search?q=fork

553 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:25:56 ]
質問です。
newでメモリを動的確保する場合失敗するとNULLが返るのですが、
これを意図的に失敗させたい場合どのような手段があるでしょうか?
どういう場合にnewが確実に失敗するのかがよくわかりません。
よろしくお願いします。

554 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 12:33:52 ]
>newでメモリを動的確保する場合失敗するとNULLが返るのですが
返らないよ.
newが失敗したらbad_allocって例外が投げられる
ためしに以下の失敗するコードを実行してみるといいよ
char *a = new char[0x7FFFFFFF];
if (a == NULL) printf("%s", "メモリ失敗"); // 標準準拠のコンパイラではこのコードは絶対に実行されない

555 名前:デフォルトの名無しさん [2008/07/01(火) 13:11:01 ]
>>554
先生、失敗しないんですけど

556 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 13:24:11 ]
ワロタ

557 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:00:19 ]
struct test_type{ char mem[0x7FFFFFFF]; };

test_type *a = new test_type[0x7FFFFFFF];
if(a == NULL) printf("%s", "print format");

558 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 14:28:44 ]
>>555 for (;;) で囲め。

559 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 15:19:53 ]
コンパイラのバージョンを聞いたほうがいい
古いやつとか組み込み用は標準と違う動作をするだろ

560 名前:553 mailto:sage [2008/07/01(火) 16:19:49 ]
ご回答ありがとうございます。
コンパイラはVC++2005付属のMSコンパイラVer 8.00.50727.42です。
>>554のサンプルコードを試しましたが、確かにNULLでなく例外を投げていますた。
コンパイラが古いとNULLを返す仕様になっているのでしょうか?



561 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 16:27:37 ]
10年くらい前なら NULL を返したかもしれない
今はみんな bad_alloc を投げる

562 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:37:37 ]
msdn.microsoft.com/ja-jp/library/kftdy56f(VS.80).aspx
>In Visual C++ 2005, the C Runtime Library's new function will also
>throw a std::bad_alloc exception if the memory allocation fails.
>If you still want the non-throwing version of new for the C Runtime Library,
>link your program with nothrownew.obj. However, when you link with nothrownew.obj,
>new in the Standard C++ Library will no longer function.

563 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 18:54:03 ]
失敗時に NULLがほしいときは new (std::nothrow) じゃなかったっけ。

564 名前:デフォルトの名無しさん [2008/07/01(火) 19:52:48 ]
>>557
数学的に破綻してるコード嫌い

565 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 19:57:04 ]
今、MSもVC++ Express Editionなる、無料コンパイラ配布してんだし、
最新の2008を使うべきでは。商用コンパイラ必要になるほどの
大プロジェクトじゃないならね。

566 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:00:24 ]
>>564
数学的に破綻って?

567 名前:デフォルトの名無しさん [2008/07/01(火) 20:18:41 ]
>>566
失敗しない環境がありうるだろ
7で始まるのがプゲラとか言う問題ではない

568 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:43:06 ]
大抵の環境で失敗するだろうから細かいことはいいんだお!

569 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:44:11 ]
size_tの最大値じゃん。

570 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 20:56:07 ]
>565
Express Edition は無料でいいんだが、MFCが使えん。

お偉いさんは、見た目が一番なんだよ。



571 名前:デフォルトの名無しさん [2008/07/01(火) 21:53:20 ]
>>570
見た目を気にするなら、なおさらMFCはダメだろ

572 名前:デフォルトの名無しさん [2008/07/01(火) 22:11:16 ]
>>569
何が?

573 名前:デフォルトの名無しさん mailto:sage [2008/07/01(火) 23:35:10 ]
size_tは符号無し整数だよ。サイズは処理系定義だけど。
それはともかく、普通に2Gも確保出来るってのが・・・w

>>565
2008はWin2Kに入らなかったりしてなw
2Kをバカにすん(ry

>>570
WTL+ATL使おうぜ

574 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:01:19 ]
>>573
メモリ確保操作は、物理メモリのサイズが足りなくても
アドレスだけ確保して返して成功してしまう場合がある。
実際に手元の2GBしかメモリ積んでないマシンで2.5GB確保してもなんなく成功する。

これは、デマンドページングといって、物理メモリの確保が
実際にメモリを踏んだ段階で初めて起こるような仕組みが存在するため。
C++のnewの場合は、コンストラクタでメモリを踏んでしまう場合があるから
この仕組みがあったからといって実際に得はしないような気はするけどな。

575 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:04:33 ]
UNIX系はそうなんだっけか
まあVCには全く関係がないな
連続した大領域確保しようとするとよく失敗するし

576 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:11:04 ]
>>574
デマンドページングが動いている状態で、実際には確保されていない(&できない)アドレスにアクセスしたらどうなるの?

577 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:12:46 ]
>>574
単にスワップメモリで足りただけじゃね?

578 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:24:19 ]
>>576
典型的にはいらないページをスワップアウトしにいく

>>577
確保だけならスワップは発生せずに即終了する

579 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 00:35:06 ]
「スワップに充分な領域が必要」な環境もあるし
「スワップに余裕があるか判断しない」環境もある。
後者だと、アクセスした途端にシステム全体でのメモリが不足することになる。
www.linux.or.jp/JM/html/LDP_man-pages/man3/malloc.3.html
>>578の世界はLinuxだけで出来ている模様。

あと、どうしても失敗したければ
new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが
この2を2Lにしないとオーバーフローする環境もあるし
逆にlong引数のnewを認めない環境もあるんだろうな。

580 名前:デフォルトの名無しさん [2008/07/02(水) 01:31:51 ]
> new char[2 << (sizeof(void *) * CHAR_BIT - 1) - 1]; を2回もやれば十分だろうが

だから、何でそうなる



581 名前:578 mailto:sage [2008/07/02(水) 01:42:20 ]
>>579
ん? なんで自分がバカにされているのか全然理解できないんだけど
いろいろな環境があることを頭に置いているからこそ578では
「典型的には」と頭につけたんだけどな

あとそのコード変だよ
少なくともビットシフトされる方は 2 じゃなくて 1 じゃないとおかしいし
そういうことやりたいなら
new char[std::numeric_limits<size_t>::max()] で十分じゃないかな
# ちなみにこういう最大限のメモリ確保は常識的な環境ならば1回ですぐに失敗するはず
# なぜなら、普通はスタックのためのアドレス空間やカーネルアドレス空間が同居しているから

582 名前:デフォルトの名無しさん [2008/07/02(水) 12:26:21 ]
> new char[std::numeric_limits<size_t>::max()] で十分じゃないかな

やっと出てきたw
が途中UNIXが出てきたり、やっと出てきたこれもmay beな言い方なので合格点はやれんな

583 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:35:24 ]
std::size_t

584 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 12:36:06 ]
SIZE_MAX

585 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:03:07 ]
VC++のスレから来ました。相談させてください。

以下の710の質問をしました。
711の回答をもらいました。
それはそうだ、と納得しました。

---
710 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:02:13
templateの使い方を教えてください
class parent;
class child : parent;
の2つのクラスがあって、
void hogeFunc(vector<shared_ptr<parent> > & param)
を呼び出したいとき、
vector<shared_ptr<parent> > vp;
は渡せるけど、
vector<shared_ptr<child> > vc;
が渡せないのはなんでかわからないです。
お分かりの方、理由を教えていただけないですか。
ちゃんと、pとcは親子関係にあるので問題ないと思っています。

711 :デフォルトの名無しさん [↓] :2008/07/02(水) 15:07:53
vector<shared_ptr<child> >& から vector<shared_ptr<parent> >& に変換できないから。
---

で、解決方法について相談させてください。以下は正しいですか?
・ void hogeFunc(vector<shared_ptr<parent> > & param)
 のように、多態をvectorでやろうとしてるのが根本的に間違っている。
間違っているならこういったコンテナの要素を多態で扱いたいときは、
どのようにコーディングされているのか教えてください。

586 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 16:27:04 ]
template<typename T> void hogeFunc(vector<shared_ptr<T> > & param){
   struct check{ void f(){ T* a=NULL; parent* b = a; } };

   ...
}

587 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:29:52 ]
樹木型(IPアドレスのような)のクラスを作成するにはどのようにしたらいいですか?

588 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:34:46 ]
class Tree {
Tree[] subtrees;
}

589 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:36:01 ]
ここC++だったorz
こんなのでいいんじゃない
class Tree {
std::vector<Tree*> subtrees;
};

590 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 17:55:38 ]
template<typename T> struct node<T> {
  T value;
  node* prev;
  node* next;
  node* parent;
  node* first_child;

  static node* tree_next(node* n){
    if(n==NULL){ return NULL; }
    if(n->first_child!=NULL){ return n->first_child; }
    return tree_next_no_child(n);
  }
  static node* tree_next_no_child(node* n){
    if(n==NULL){ return NULL; }
    if(n->next!=NULL){ return n->next; }
    if(n->parent==NULL){ return NULL; }
    return tree_next_no_child(n->parent);
  }
};

for(node* it=n; it!=NULL; it=node::tree_next(it)){
  
}



591 名前:デフォルトの名無しさん [2008/07/02(水) 18:27:09 ]
>>587
C++を使う
できない人は他のスレで聞く

592 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 18:47:12 ]
>>591
ここってC++スレじゃないのか??

593 名前:デフォルトの名無しさん [2008/07/02(水) 20:33:00 ]
>>592
そうだけど、あの聞き方ではhello worldから教える必要があるだろ

594 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 20:53:29 ]
俺も興味あるんだが多階層にクラスを定義した場合下みたいな使いかたってできる?
Aclass.Bclass.element = NULL
昔クラスのpublic下にクラスを定義し派生用の関数で増やせるようなものを作ろうとしたんだがうまくいかなかった記憶があるもんで…

595 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:01 ]
class Hoge {
const char msg="nullpo";
}

これだとエラー出ますが、こういうことをconst付けてやるにはクラス外に書くか
クラス.cppの方に書くか、もしくは使用する関数の中で書くしか無いのでしょうか。

596 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:03:35 ]
大体型がおかしいだろ。
staticつけとけ

597 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:22:21 ]
よーだょ。
ただしbool/char/short/int/long系に限りできる。floatは×

598 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:23:55 ]
どうも、static付けてみます

599 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:40:22 ]
enumが便利だよ

600 名前:デフォルトの名無しさん mailto:sage [2008/07/02(水) 21:45:09 ]
あ、なるほど。すっかり忘れてました。



601 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 00:45:52 ]
C++0x出たら、ハゲはプログラミング言語C++の改訂版だすのかな?
なんか第3版の次の版が洋書では出てたけど、日本語版はスルーなのかな。
まぁこのタイミングでだしてもしょうがないし、できればC++0x反映させた
版を出して欲しいけどね。

602 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:10:26 ]
const 定数のみのクラスってどうやってかけばいいのですか?
あとこういうエラー用の定数クラスは1枚のファイルに1こずつ
定義するのが流儀?

603 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:14:11 ]
Javaじゃあるまいし

604 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:29:34 ]
>>602
なんでクラスの中に定義する必要があるの
せいぜいネームスペースでいいじゃん

605 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:34:25 ]
シングルトンですけど、boostに入ってないですよね?
Lokiぐらいしかないんでしょうか?

606 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:45:21 ]
すみません、素朴な疑問なのですが
C++ではハードあるいはOSレベルの例外(例えば零による除算)は
通常どのように扱うののでしょうか?

もう少し具体的に言うと、例えばVC++なら_ _try, __except という
構造化例外のための機能が提供されていますが、
gccなどの他のコンパイラではこれと同様な機能を実現する手段は
ないのでしょうか。

windows, linux 双方で稼動させる必要のあるシステムを作るとしたら、
例外処理をどのようにするべきなのか非常に疑問です。

607 名前:606 mailto:sage [2008/07/03(木) 01:47:54 ]
うーん・・・

msdn.microsoft.com/ja-jp/library/cc440193(VS.71).aspx
>C++ でプログラミングしたり、コードに移植性を持たせたい場合は、
>可能な限り標準 C++ の例外を使うことを強くお勧めします。

developer.mozilla.org/ja/docs/C%2B%2B_Portability_Guide
>例外は、幅広くは実装されていない C++ の次なる一例です。
>そのため、それらの使用は C++ の移植性を低下させます。
>例外を使ってはいけません。運悪く、同じような機能をもったよい代替案はありません。

例外についての注意勧告がされていますが、では実際にどうするかという
代替案はないということなのか・・?

608 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:55:31 ]
>>605
209.85.175.104/search?q=cache:FXdOX_s6DgAJ:pc11.2ch.net/test/read.cgi/tech/1192662575/386-411+singleton

609 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 01:56:59 ]
鼻から悪魔という言葉があってな

610 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:05:31 ]
>>607
俺はWinCE用のソースとかでは
std::auto_ptr<std::exception> を戻り値にしてる。
コンストラクタで失敗したものは fail() で返す。
で、毎回戻り値などのチェック。

パフォーマンス悪そうだし面倒なので全部そうしてるわけじゃないけど。



611 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:18 ]
>>607
VC++の話をすると、/EH系のオプションがあって最適化やパフォーマンスの関係で使い分ける。
 オプションなしの場合C++例外は一切使わない。
 /EHs(c) 同期例外だけをキャッチする。c で extern "C"関数は例外を発生させないと仮定する。
 /EHa  同期と非同期例外をc++例外としてキャッチする。
で /EHaの場合は stack overflowを除くほとんどのハード系の例外をキャッチ出来る。
もちろんゼロ除算も。

612 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:09:23 ]
>>608
どうもです。
detailsの中にあることにはあるんですね。
とりあえずkろえを使っておきます。

613 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 02:26:36 ]
>>610-611
ありがとうございます。

VC++の場合はわかるのですが、
gccなどでは同じような処理を行えないのでしょうか?
メモリの不正アクセスにしろ零除算にしろ、いくらでも
起こりうる例外だと思うのですが、Javaのように
統一的にcatchできないものかと悩んでいます・・・。

実際、至るところで零除算の起こりうる数値解析の
ようなシステムを作ったとして、いざシステムを起動
したら零除算で処理が中断したが、どこで起こったかは
わからない、なんてことは有り得ないですよね・・?

614 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 03:24:19 ]
gccというよりunix系だとそういうのはsignalではないかな。
ゼロ除算ぐらいなら例外ではなくてプログラムで事前にチェックすべきもので、
メモリの不正アクセスはデバッグ時に潰すべきもので、
例外でキャッチしてリカバリーをかける類のものじゃない。


615 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:55:32 ]
>>585
最初から vector<shared_ptr<parent> > だけ使ってればいいんじゃね?

616 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 05:59:33 ]
>>594
struct { struct { void* element; } Bclass; } Aclass;
よくわからんが、これでやりたいことができたことになるの?

617 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 06:33:36 ]
>>607
どこまでの移植性が必要かで判断すればいい。
Windowsだけなら構造化例外を使ってもいいだろうし。、gccあたりを含めるならくらいなら例外は使えるだろうし。


618 名前:デフォルトの名無しさん [2008/07/03(木) 09:30:37 ]
>>607
mozilla のページ、情報がえらく古いな
もっとも古いというだけでは済まされない記述も散見されるが

619 名前:585 mailto:sage [2008/07/03(木) 10:09:51 ]
>>586
目からうろこがぼろぼろでた気分です。
ありがとうございました。

620 名前:デフォルトの名無しさん [2008/07/03(木) 12:12:50 ]
shared_ptrをメンバとして持つクラスで、そのメンバを取得したいとき、
getBBB1, getBBB2, getBBB3の実装をした場合、状況によるんでしょうが、適切なのはどれか教えてもらえないですか。
それぞれのメリット、デメリットがはっきりとわかっていません。
class AAA {
private:
  shared_ptr<BBB> bbbptr;
public:
  AAA() {
    bbbptr = new BBB;
  }
  shared_ptr<BBB> getBBB1() {
    return bbbptr;
  }
  shared_ptr<BBB>& getBBB2() {
    return bbbptr;
  }
  BBB* getBBB3() {
    return bbbptr;
  }
};




621 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 12:55:48 ]
状況による面もあるけど、
基本的にBBB1以外は間違った使い方だと思っていい。

622 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:00:22 ]
#include <stdio.h>

int main(void)
{
float f;

for(f=1.0; (int) f<=5; f=f + 0.1)
printf("%f \n", f);

return 0;
}

このプログラム実行したら

2.600000
2.700000
2.799999
2.899999
2.999999
3.099999
3.199999
3.299999
3.399999
3.499999

と2.7から普通に計算できなくなりました
2.700000
2.800000
2.900000
と計算するようにしたいのですがどればいいですか?


623 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:07:39 ]
>>622
float -> double
もしくは
二進化十進表現でgoogle

624 名前:デフォルトの名無しさん [2008/07/03(木) 13:16:32 ]
>>623
できました><
floatって精度かなり悪いみたいですね・・・

625 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:40:07 ]
>>622
つうか思いっきりC言語じゃね?

626 名前:デフォルトの名無しさん [2008/07/03(木) 13:48:35 ]
Cで利用されることが推奨されているDLLがあって、そのヘッダファイルがC用に提供されていて、
それをC++で利用できない場合って、どういう理由が考えられますか?

できない場合があるとしたら、回避方法は、自分でヘッダを修正するってことでしょうか?

627 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 13:57:25 ]
マングリング
extern "C"

628 名前:デフォルトの名無しさん [2008/07/03(木) 16:25:02 ]
>>626
#ifdef __cplusplus
#error C++ is not supported
#endif
とか書かれてるなら諦めるしかないだろ。

629 名前:デフォルトの名無しさん [2008/07/03(木) 17:52:58 ]
誰か教えてください。。。

現在プログラムでマウスクリックをさせるものを作っていて、
ボタンのクリックなどはできるようになったのですが、
タブ(TabControl)の切り替えができません。

だれかご存知の方がいましたらご教授いただけると助かります。。

以下プログラム抜粋----------------------------------
POINT pt = {任意の座標X , 任意の座標Y};
HWND hWnd = ::WindowFormPoint(pt.x , pt.y);

// マウスを任意の位置に移動
SetCursorPos(pt.x , pt.y);
// クリック (Down -> UP)
::SendMessage(hWnd , WM_LBUTTONDOWN , 0 , MAKELPARAM(pt.x , pt.y));
::SendMessage(hWnd , WM_LBUTTONUP , 0 , MAKELPARAM(pt.x , pt.y));

よろしくお願いします。

630 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:03:14 ]
スレ違い、Win32APIスレで聞いたら



631 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 18:18:18 ]
>>620
BB1は安全。戻り値最適化が期待できるので速度も十分
BB2は参照が生きているうちにAAAが削除される場合に問題が発生するが、それに気をつければ高速に使える。
BB3は危険。別のshared_ptrに戻りを代入するミスを誘発しそう。

632 名前:デフォルトの名無しさん mailto:sage [2008/07/03(木) 23:49:12 ]
BBB2も代入できるだろ

633 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:52:38 ]
C99では
if (...)
statement...;
else
statement...;
などのstatementがそれぞれ{}で囲まれたように扱われるようですが
これはC++から来たものなのですか?

634 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:54:36 ]
元から (C89から) そうでは?

635 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 21:59:52 ]
C99よく知らないんだけど、
囲まれたように扱われる場合と
囲まれたように扱われない場合って何が違うの?

636 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:08:27 ]
変数のスコープのこといってるんじゃね?

637 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:11:41 ]
>>636
そもそも{}で囲まないと変数は定義できないだろう。

638 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 22:14:32 ]
もともとif文の構文は
if (expr) statement [ else statement ]

expr ; の形の単文はstatementだから{}で囲む必要は無い
複文はstatementではないから、{}で囲んでstatementにしなければならない

そんだけのことだ
C99とかは関係ないだろ

639 名前:デフォルトの名無しさん mailto:sage [2008/07/05(土) 23:36:13 ]
seclan.dll.jp/c99d/c99d07.htm#dt19991108
「選択文と反復文のブロック化」のことだな。
C++にもあるぞ、X3014:2003「6.4 選択文」の1, 2節目などなどに規定がある。

そこではこういう例が載せられている。
if (x)
  int i;
このルールによって、if文を抜けたらiはもう使えないという具合。

>>637
C++だと、ブロック内の宣言は文だから、できるんだなこれが。
C99だと(なぜかC++と違って)文ではないから、お前の言うとおり出来ないけどな。

640 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:17:21 ]
>>639
そんなVC6の時代の知識で語られても。



641 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 04:23:29 ]
VC6でお世話になったマクロの意味がわかる
#define for if (0); else for


642 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:09:27 ]
#define 定義は極力使わない方がいい、と、セキュアプログラミング系の本に書いてあったが

643 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:13:43 ]
>>642
それは生兵法というもの

644 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:30:48 ]
#define SubclassWindowみたいなマクロは死ねばいいと思う
使うならせめて大文字ですよね

645 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 13:51:36 ]
>>642
OpenSSL脂肪wwwwwwwww

646 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 14:42:59 ]
あとで#undefで即死されるマクロはいつもasdfだとかzxcvだとかに命名してる

647 名前:デフォルトの名無しさん mailto:sage [2008/07/06(日) 16:56:32 ]
>>646のコードはメンテしたくない。

648 名前:デフォルトの名無しさん [2008/07/06(日) 20:25:50 ]
同じく

649 名前:デフォルトの名無しさん mailto:sage [2008/07/07(月) 08:09:21 ]
hogehogeマクロ内でboost.pp.repeatとかつかってて子マクロが必要なら、
hogehoge_iとかhogehoge_iiにしてる。
後で#undefで即死されるのは同じだが。

650 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:06 ]
while(1)中のswtch文で特定のcaseの場合whileから抜けたいのですが2重の構造をbreakさせる方法はありませんか?
gotoで抜ける手も考えましたがあまりスマートな方法じゃないのでできれば避けたいです



651 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:13:48 ]
while(1)をやめる

652 名前:デフォルトの名無しさん mailto:sage [2008/07/08(火) 00:19:50 ]
whileの代わりにgotoをつかえばいい






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<209KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef