GCC拡張

排他的論理和 .XOR.

GCC version 3.4以前のGNU Fortran(g77)では、 排他的論理和を計算する.XOR.演算子が使用できる。 この拡張は、GCC 4.0で、Fortran フロントエンドの入替えに伴い自然消滅した。 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=33432 一部で、復活してほしい…

配列の要素アクセス

GCCでは、アドレスを取得できない配列に対しても、添字付けを行うことが出来る。 アドレスを取得できない配列には、以下の二つがある。 register修飾されているもの。 関数の戻り値である構造体のメンバであるもの。 この拡張は[]で要素アクセスする場合にの…

固定小数点型

GCC version4.3以降(要--enable-fixed-point)では、固定小数点型が使えるはずである。 しかし、現時点では、GCCのバグのため、ビルドに失敗している。 10進浮動小数点型と違い、基本的な演算は、追加のライブラリを必要としない。 現在、何とか使えるように…

10進浮動小数点型

GCCのversion4.2以降(おそらく)(要--enable-decimal-float)では、 10進浮動小数点型_Decimal32、_Decimal64、_Decimal128が利用できる。 ただし、GCC単独では、10進浮動小数点型の宣言が出来るだけで、 10進浮動小数点が関わるすべての変換、演算は利用でき…

スレッドローカル記憶クラス

GCCではキーワード__threadを使うことにより、スレッドローカルな変数を宣言できる。 int func() { static __thread int x; ... return x; } この機能は、Version 3.3からあるらしいが、cygwinでは使えなかった。 しかし、Version 4.3からは、cygwinでも使え…

不完全な列挙型

GCCでは、不完全な列挙型を宣言できる。 C++では利用できない。 enum foo; /* 不完全な列挙型の宣言 */ ... enum foo { hoge, hage, moge, sage, fuge }; 他の不完全型同様、変数を定義したり、sizeof演算子のオペランドにすることはできない。 Cでは sizeof…

最小値、最大値を返す演算子

GCCのVer4.1以前のC++では、最小値、最大値を返す演算子?が利用できる。 この二つの演算子は、ビットORと論理ANDの間の結合順位をもつ左結合の演算子である。 GCCのマニュアルには、この演算子と似た振る舞いをもつ以下のマクロが紹介されている。 #define M…

配列変数への代入

GCC ver3.0以前のC++フロントエンドでは、型が全く同じ配列間で代入することができる。例 int a[N],b[N]; a = b; このとき、aとbはcv修飾も含め全く同じ必要があるため、極めて使いにくい。 また、コンストラクタを定義していないクラスに対して、この拡張機…

配列メンバの初期化

久々にGCC拡張について書く。 初期化リスト中に、C99の複合リテラルと同じ書式により、配列メンバを初期化することができる。 version 4.1以前のGCCでのみ利用できる。 struct foo { int bar[2]; foo(int x, int y):bar((int[2]){x,y}){} }; この拡張は、cpp…

文字列のように連結されるincludeファイル名

GCC 2.95以前では、#include "..."の形式でファイルをインクルードする場合、 ファイル名を複数に分割することができ、それらは、連続する文字列リテラルのように連結される。 #include "iostream" ".h" この機能は、ヴァージョンの異なるヘッダを使い分ける…

浮動小数点定数

整定数式が必要なところで、浮動小数点を含む式が利用できる。 enum { digits10 = (int)(53*0.30103) }; また、静的定数メンバの宣言で、メンバが浮動小数点型であっても、クラス内で初期値を与えることが出来る。 struct foo { static const double pi = 3.…

複数行にわたる文字列

GCC 2.95では、文字列内部に改行を含めることができる。 const char* str = "foo ここも文字列内 bar";この機能は、GCCのCHILLフロントエンドで使われている。 文字列内に改行文字を含めたいという欲求は、少なからずあるようで、C++0xで可能になるかもしれ…

ブロックの終端にラベル

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から始まる整定数に展開される。

2進定数

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

__iterator__による暗黙のループ

GCC ver 2系列には、__iterator__ というキーワードが追加されており、暗黙のループを作ることができた。 __itearator__ i = 5; a[i] = b[i]; これは、以下のコード片とほぼ同じ int i; for(i = 0; i < 5; ++i) a[i] = b[i]; このGCC拡張機能は、GCCの本家に…