*C言語 [#bf55a204]
#contents
**ビットフィールド [#m1836823]
構造体や共用体のメンバを、ビット単位で宣言、使用できる
#code(C){{
#include <stdio.h>
struct _xyz{
unsigned char x : 1; // 1bitのデータ
unsigned char y : 3; // 3bitのデータ
unsigned char z : 2; // 2bitのデータ
char c; // 1byte(8bit)のデータ
};
int main(void)
{
struct _xyz xyz = { 1, 5, 0, 'a' };
printf( "sizeof=%d\n", sizeof(xyz) );
printf( "x=%d y=%d z=%d c=%c\n", xyz.x, xyz.y, xyz.z, xyz.c );
return 0;
}
}}
実行結果
sizeof=2
x=1 y=5 z=0 c=a
**__attribute__ [#y80c5ab2]
gcc の C言語拡張機能で、変数や関数に属性を付与できる。
|__attribute__( (__unused__) )|使用されなくてもコンパイラがワーニングを出さない|
|__attribute__( (aligned(x)) )|アライメントをxに調整する|
|__attribute__( (section("name")) )|リンク時にセクション"name"に配置する|
|__attribute__( (packed) )|構造体や共用体で、メンバの隙間を開けずに詰めて配置する|
使用例
#code(C){{
int function( int arg1, int arg2 __attribute__( (__unused__) ) )
{
return arg1 + 1;
// arg2 を使用しなくても、コンパイル時に警告されない
}
}}
**自動的に定義される定数 [#u49204fb]
コンパイラによって、定義済の定数が存在する。主にデバッグ目的で使用する。
|CENTER:定数|CENTER:意味|CENTER:型|
|__FUNCTION__|関数名|文字列|
|__FILE__|ファイル名|文字列|
|__LINE__|行数|数値|
|__DATE__|コンパイルした時の日付|文字列|
|__TIME__|コンパイルした時の時刻|文字列|
|__STDC__|ANSI-Cに準拠していると値: 1|数値|
|__GLIBC__|glibcのバージョン|数値|
使用例 test.c
#code(C){{
#include <stdio.h>
int main(void)
{
printf("%s:%s:%d", __FUNCTION__, __FILE__, __LINE__);
return 0;
}
}}
実行結果
main:test.c:5
Gy7TxC <a href="http://jnajmpidnmeq.com/">jnajmpidnmeq</a>, [url=http://nwnpzjfkuegf.com/]nwnpzjfkuegf[/url], [link=http://yrfatflbyqcp.com/]yrfatflbyqcp[/link], http://zknywcqblonh.com/