2007-06-01から1ヶ月間の記事一覧

ブロックの終端にラベル

C++では gcc2.95 以前、Cでは gcc3.3 以前では、ブロックの終端にラベルを置くことができる。 while(i) { if(i == 1) { i = 0; goto endblock; } printf("not reach\n"); endblock: } goto文のラベルだけでなく、switch文中のcase/defaultラベルも同様に書く…

配列new時にPOD型を初期化する。

struct POD { int data; }; new POD; // (1) new POD(); // (2) new POD[N]; // (3) new POD[N](); // (4) 標準C++は、POD型を配列new時に初期化する方法を提供していない。 しかし、GCCでは(4)の構文により、配列new時にPOD型の0初期化ができる。 標準C++で…

条件演算子のオーバーロード

GCC2.95では、条件演算子?:をオーバーロードできる。 class hoge; hoge operator?:(const hoge& cond, const hoge& texpr, const hoge& fexpr) { // 条件演算子の実装 } 条件演算子を定義する関数は、二つの引数をもつメンバ関数、三つの引数をもつ非メンバ…

非静的メンバに対するsizeof

非静的データメンバのバイト数をクラスのインスタンスを作らずに得ることができる。 class foo { public: int data; }; size_t size = sizeof(foo::data); この機能はGCC 2.95で利用できる。 というか、これって C++0x の新機能じゃねぇか。 http://www.open…

__TIMESTAMP__ マクロ

ファイルの最終更新日時を表す"Day Mmm dd hh:mm:ss yyyy"形式の文字列 gcc 4.2より利用できる。 VCのものと同じ Digital Mars Cにも同名のマクロがあるがこれはコンパイル日時を示す別物__INCLUDE_LEVEL__ マクロ インクルードのネストの深さを示す整定数 _…

__COUNTER__ マクロ

VCの __COUNTER__ と同じもの。 gcc 4.3より利用できる。 使用するごとに一つずつ増える0から始まる整定数に展開される。

情報流出

<警視庁資料>1万件がウィニーネットに流出 少年実名も Winnyの開発は違法なのに、使用は合法なの? 警察の考えは分からん。

日本語識別子

GCC

GCCで日本語の識別子を使いたいと思い、GCCのソースを適当にいじる。 --- libcpp/charset.c.orig +++ libcpp/charset.c @@ -80,5 +80,5 @@ Foundation, 51 Franklin Street, Fifth Fl #if HOST_CHARSET == HOST_CHARSET_ASCII -#define SOURCE_CHARSET "UTF-…

続・混ぜるな危険

GCC

昨日の続き 無事、Bugzillaに登録された。 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32245 ついでに報告した bit-field のバグ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=32244 http://gcc.gnu.org/ml/gcc-bugs/2007-06/msg00557.html intより大き…

混ぜるな危険

C++

GCCやVCはメンバへのポインタをメンバにもつPOD型を正しくゼロ初期化してくれない。 #include <cassert> struct foo { int mem1; int foo::* mem2; }; int main() { foo x = {0}; assert(x.mem2 == foo().mem2); return 0; } 対応策 POD型の構造体のメンバにはCにない</cassert>…

2進定数

表題の通り2進数の整定数を書くための機能ですね。 int i = 0b10101011001; このGCC拡張は、GCCに詳しい人でもあまり知られていないんじゃないだろうか。 というのも、昨日、GCC 4.3系列の開発枝に入れられたばかりの新規の拡張機能である。http://gcc.gnu.o…