よくある質問(FAQ)

CasePlayer2で解析可能な「C99」の記述を教えてください。

言語仕様(C99 or GNU-C)について

質問

CasePlayer2の「言語設定」で「C99」を選択したとき、解析可能なソース記述を教えてください。

回答

CasePlayer2で解析可能なソース記述は下記の通りです。「ANSI-C」から追加された記述を掲載しています。

※制限事項について
CasePlayer2には、「C99」言語仕様の解析において制限事項があります。詳細については「Windowsメニュー」⇒「GAIO CasePlayer2」⇒「ヘルプ」を辿り、CasePlayer2マニュアルをご覧ください。

■制限事項掲載位置
ー操作方法
 ー仕様書生成
  ーC仕様書生成
   ーC仕様書生成仕様
    ー拡張言語モードの制限  (※「C99に対する制限事項」の項目に掲載されています)

■CasePlayer2で解析可能な「C99」の記述

① 変数宣言はブロック先頭でなくてもよい
void func()
{ 
 sub_func(123);

 int a = 10;
 sub_func(456);

 for (int i = 0; i < 5; i++)
 {
  sub_func(123);
 }
}

② bool 型
_Bool flag;
③ 64ビット整数
void func()
{
 long long ll = 123LL;
 unsigned long long ull = 123456ULL;
 long long int li = 1234LL;

 printf("*** %lld %llu %lld\n", ll, ull, li);
}

④ 指定する添字の配列要素の初期化
int array[] = { 10, [3] = 13, 14 };
⑤ 指定する構造体メンバの初期化
struct Person {
 int age;
 char *name;
};
struct Person data = { .name = "abcdefg", .age = 49 };

⑥ 動的なサイズ指定による配列宣言
void func()
{
 int sz = 10;
 char s[sz];
 strcpy(s, "abcd"); 
}

⑦ サイズ0の配列宣言
struct Person {
 int size;
 char name[];
};

void func()
{
 struct Person *p = malloc(sizeof(struct Person) + 10);
 strcpy(p->name, "abcdefg");
}

⑧ 複合リテラル 【配列・構造体のリテラル(定数)を表現できる】
struct Person {
 int age;
 char name[10];
};
struct Person *p;

void func()
{
 pp = &(struct Person3){49, "abcdefg"};
 int data = (int []){10, 20, 30, 40, 50}[3];
}

⑨ インライン関数
static inline int add(int a, int b)
{
 return a + b;
}

void func()
{
 int val = add(10, 5);
}

⑩ 空引数のマクロ関数
#define val(val,suffix) val ## suffix

long lm = val(3,L);
int im = val(3,);

⑪ 可変長引数のマクロ関数
#define dbg(fmt, ...) printf(fmt, __VA_ARGS__)

void func()
{
 dbg("**** %d %d\n", 10, 20);
}

⑫ 現在の関数を参照するマクロ
//__func__ 現在の関数名
//__LINE__ 現在の行番号
//__FILE__ 現在のソースファイル名

void func()
{
 printf("%s %d %s\n", __func__, __LINE__, __FILE__);
}

⑬ enum 宣言での余分なカンマ
enum { a, b, c, };
⑭ restrict ポインタ
void func9(int n, int * restrict p1, int * restrict p2)
{
 for (int i = 0; i < n; i++)
  p1[i] += p2[i];
}

⑮ 定義済みマクロ名
//__STDC_VERSION__は 「C99」のバージョン(199901L)
long version = __STDC_VERSION__;

⑯ _Pragma
_Pragma("pack(1)")  // -> #pragma pack(1)
struct tag {
 char a;
 int b;
};

⑰ 浮動小数点定数の16進数表記
double d = 0x1.23ap32;
⑱ _Complex, _Imaginary型
float _Complex fl;
double _Imaginary dl;

⑲ インラインアセンブリ記述
void func()
{
 asm (" nop ");
}