09/06/13 13:47:46
標準出力? 何ソレ? みたいな環境もあるからな。
それはしゃーない。
966:デフォルトの名無しさん
09/06/13 14:05:57
>>963
"Hello,world"はchar[12]型。
それが配列からポインタへの変換でchar*になる。
型の問題はどこにもないぞ。
967:デフォルトの名無しさん
09/06/13 14:15:59
ヒント:リテラル
968:デフォルトの名無しさん
09/06/13 14:23:34
え?文字列リテラルは書き換えできなくてもchar*に変換できるだろ。
969:963
09/06/13 15:52:05
>>964-968
アドバイスサンクスです。
関数コール時に一時的にメインメモリ上にchar[12]の領域が確保され
そのポインタが渡され、型の問題が生じない。という理解で良いですか。
char[12]が一時的に確保されたなら、その領域が解放されるのは
PutString("Hello,world!");
を抜けた時でしょうか。
970:デフォルトの名無しさん
09/06/13 16:12:22
いいや、一時的な領域が作られることはないよ。
基本的に、文字列リテラルは予め用意された静的な領域に置かれるが、
そこへのポインタそのものがPutStringの引数として渡される。
971:デフォルトの名無しさん
09/06/13 16:20:01
型安全についてCよりも厳しくなったC++では
この変換を「死の変換」と呼ぶ。
972:963
09/06/13 16:26:04
>予め用意された静的な領域に置かれる
納得しました。
>>971
「死の変換」ですか・・・
関数から抜けた後は、その文字列リテラルへのポインタがわからなくなり
永遠にアクセスできない領域になってしまうためそう呼ばれるのでしょうか。
char hello[12] = "hello,world!"
と最初のほうに書いておき、
PutString(hello);
とやるほうが望ましいでしょうか。
973:デフォルトの名無しさん
09/06/13 16:28:43
C++でnamespaceの名前つけかたのルールみたいなものってあるんですか?
Javaだと全部小文字でドメイン名をひっくり返したものとか、あるけど。
大文字で始まってるのよく見る気もするし。
ドットが入ってるのあんまり見ないし
ドメイン名っていうのはかぶらないのでいい方法だと思うけど
yahoo.co.jpだったらどんなのつけます?
974:デフォルトの名無しさん
09/06/13 16:31:59
そういうのは、プロジェクトポリシーで決まるんじゃねーの
975:デフォルトの名無しさん
09/06/13 16:36:10
>>972
いや、それよりもPutStringの引数にconstつけろよ。
976:デフォルトの名無しさん
09/06/13 16:40:57
>>973
全世界にソース公開とかじゃない限り「絶対にかぶらない名前をつける」ってのは
重視しなくていいんじゃないかな。
ちなみに、自分はクラス名と同じ命名規則。
977:デフォルトの名無しさん
09/06/13 16:44:55
プログラムのわかりやすさではstringだな。
生成と動作のコストがかかるが。
978:デフォルトの名無しさん
09/06/13 16:52:01
長い文字列、データをソース内に貼り付けるとコンパイル時間かかりサイズもでかくなる。
計算や短い文から生成できるならそれ使うべき。
979:デフォルトの名無しさん
09/06/13 17:29:48
日本語の識別子を使う人なんてめったにいないだろうから
namespaceで日本語を使えば被る確立はほとんどないだろう
コンパイラ依存だけど
980:デフォルトの名無しさん
09/06/13 17:57:37
>>979
どう考えたって、
仕様違反のコンパイラ依存に確実になるくらいなら
namespaceがかぶる危険があるってだけの方が
まだマシだと考えるヤツが大半だと思うが。
ローマ字に止めるべし。
981:デフォルトの名無しさん
09/06/13 18:01:00
和製英語のローマ字読み最強
982:デフォルトの名無しさん
09/06/13 18:19:57
BOOL bBlockConnect(char * pAddr, int iPort, unsigned int uiMsg);
int iOnSocketEvent(WPARAM wParam, LPARAM lParam);
BOOL bInitBufferSize(DWORD dwBufferSize);
XSocket(HWND hWnd, int iBlockLimit);
virtual ~XSocket();
int m_WSAErr;
BOOL m_bIsAvailable;
BOOL m_bIsWriteEnabled;
void _CloseConn();
int _iSendUnsentData();
int _iRegisterUnsentData(char * cData, int iSize);
int _iSend(char * cData, int iSize, BOOL bSaveFlag);
int _iSend_ForInternalUse(char * cData, int iSize);
メンバ関数の 始まりの文字が
b -> return BOOL
i -> return int
と規則的に作られてるのですが
_ (アンダーバー)で始まるのは何の意味があるのでしょうか?
983:デフォルトの名無しさん
09/06/13 18:24:17
実装した奴が、そうしたかったから
言語仕様での意味はないはず。
984:デフォルトの名無しさん
09/06/13 18:39:53
privateなメンバとか。何か規則があると思う。
スコープがクラスだから、_[a-Z]+()なメンバ関数があっても他のスコープと識別子がかぶることはないが、
_[a-Z]+で始まる識別子は予約されているので、マクロで置き換えられたときに嵌まるおそれがある。
985:デフォルトの名無しさん
09/06/13 19:00:49
STLのmapの容量はかってみた。
<int,int>で2の21乗個登録したら、127M使用していた。
一個あたり、64バイト。
通常の配列だと4バイト、16倍も消費量が多い。
もっと少なくなるやつある?