// Pythonとかの言語しかやったことのないワタシが知らなかった概念とかをメモ。かつkobitoの投稿テスト
型のキャスト
C言語だと
- 基礎的な型変換
int a = 3, b = 2;
float f, h;
f = a/b;
h = (float) a/b;
// fは1となり、hは1.5になる。
- ポインタの型変換
int i = 0x41;
char = *c = (char *) &i;
// 出力結果はAとなる。 *追記 (指摘を受けた部分について補足を追加)
// 追記: iを指す参照をcharのポインタへ変換している
// 処理系依存の記述なので正常に動かないこともある。
// あくまでデモであり、こういった読めない処理はするべきでない
int x = 1;
printf("%d", (int)&x );
//コンパイラによっては警告を吐く? が、intのポインタがintに変換されて出力される
define(マクロ)について
C言語において、defineがよく使われるのは以下の三つ
- 記号定数の定義
- 関数マクロ
- 条件付きコンパイル
記号定数の定義
- 他の言語でいうところの、constのような形で使う
ソース上にリテラルを直接書くのは望ましくない。そういったものは
#define MAX 100
などというように定義する。
関数マクロ
表記の仕方は
#define マクロ名(引数) 処理
というようにする。
プリコンパイラによるマクロ関数の展開例:
macrofunc.cpp
#define MIN(a, b) ((a) < (b) ? (a) : (b))
// ~ 省略 ~
x = MIN(n1, n2);
// x = ((n1) < (n2) ? (n1) : (n2)); というように展開される
関数マクロは、一般に関数呼び出しのオーバーヘッドをさける為に使用される。
演算子の優先順位などで、直感的ではない挙動をすることがあるので、()の付け方などに注意する。
条件付きコンパイル
ifdef
#ifdef MACRO
// ~処理~
#endif
これは、'MACRO'が定義されている場合は#ifdef~#endifまでの中を有効にする。という意味である。
ifndef
これは上記の#ifdefとは逆で、MACROが定義されていない場合は#ifndef~#endifまでの間を有効にする。という意味である。
これらの使いどころ
- header fileをかく時の定石として次のようなものがある
my_h.h
#ifndef MY_H //ヘッダの最初
#define MY_H
// ヘッダの定義
#endif //ヘッダの最後
このようにすることで、複数のソースからmy_h.hがインクルードされても一度だけmy_h.hの中身を有効にすることができる。
# Xcodeでヘッダファイルを定義すると自動でこの一文が挿入される