C言語の標準ライブラリ関数 setjmp() と longjmp() を呼び出すことで多段の関数呼出階層を飛び越えるジャンプ(いわゆるGOTO処理)を実現できます。しかしながら、現代的なプログラミングでは GOTO文 が忌避されるように、setjmp() と longjmp() を使ったジャンプも推奨されません。やむを得ず setjmp() と longjmp() で実装された既存のソースコードを理解するための助けとなることを目論んだ解説です。
「C言語」タグアーカイブ
[C言語] const修飾したポインタ
- ポインタ変数が指す先が read-only である。
- ポインタ変数が read-only である。
- ポインタ変数が指す先とポインタ変数がともに read-only である。
[C言語] 多次元配列へのポインタ
C言語の多次元配列へのポインタの説明とサンプルコードです。
1. 配列要素へのポインタ
最初は導入です。C言語の入門書にも登場する配列とポインタの関係を説明します。
1.1. 一次元配列とポインタの組み合わせ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <stdio.h> #define NUMBER_OF_COLUMNS 4 int main(void) { int linear_array_x[NUMBER_OF_COLUMNS] = { 1, 2, 3, 4}; int linear_array_y[NUMBER_OF_COLUMNS] = { 11, 12, 13, 14}; int *top_of_columns; top_of_columns = linear_array_x; printf("linear_array_x[1] = %d\n", top_of_columns[1]); /* 2 */ top_of_columns = linear_array_y; printf("linear_array_y[1] = %d\n", top_of_columns[1]); /* 12 */ return 0; } |
もっともシンプルな例です。整数型の1次元配列を定義して、配列の先頭要素へのアドレスをポインタ変数 int *top_of_columns
に代入しています。
[C言語] データ型モデル
データモデル | short | int | long | long long | void* | 適用 |
---|---|---|---|---|---|---|
ILP32 | 16 | 32 | 32 | 64 | 32 | 一般的な32bit環境 |
LLP64 | 16 | 32 | 32 | 64 | 64 | 64bit Microsoft Windows |
LP64 | 16 | 32 | 64 | 64 | 64 | 64bit Linux, macOS, iOS |
[C言語] enum型 の サイズ
- [Q] C言語において enum 型のサイズは決まっているか?
- [A] 決まっていない。
enum型はsizeof(int)を超えることはない。
Microsoft Visual Studio において enum型 は int で固定である。
一方, 処理系(IAR Embedded Workbench, CodeWarrierなど)によってはenum定数で保持に必要な最小の型を使用する。範囲指定がなければ unsigned よりも signed を優先する。
[C言語] TRUE / FALSE の定義のいろいろ
[C言語] プリプロセッサ演算子
[C/C++] 内部結合と外部結合
- 内部結合 : Internal Linkage
- 外部結合 : External Linkage
ファイルスコープのオブジェクト定義(いわゆるグローバル変数定義)
static | 記憶域指定子なし | extern | |
C言語 | 内部結合定義 | 外部結合定義 | 仕様なし |
C++ | 内部結合定義 | 非const: 外部結合定義 const: 内部結合定義 |
外部結合定義 |
[C] ディレクティブ
プリプロセッサへの命令
#include
#define
#if
#ifdef
#error
#warning
#pragma
[C] グローバル変数の宣言と定義
(1) 外部定義 / external definition
定義と初期化
1 2 3 4 5 |
int x = 0; int main(void) { /* 中略 */ } |
(2) 外部宣言 / extern declaration
翻訳単位外(ファイルの外)で定義したグローバル変数を参照する。メモリは割り当てない。
1 2 3 4 5 |
extern int x; int main(void) { /* 中略 */ } |
(3) 仮定義 / tentative definition
どこかに外部定義があれば外部宣言としてふるまい、なければ外部定義としてふるまう。
したがって同じ名前の仮定義が複数存在しても、ひとつのメモリ領域を参照する。
1 2 3 4 5 |
int x; int main(void) { /* 中略 */ } |
上記のソースコードだけでは『定義』であるか『宣言』であるか確定できない。