LoginSignup
8
7

More than 5 years have passed since last update.

#C/C++初心者≠プログラマ初心者用 基礎知識チートシート#1

Last updated at Posted at 2012-04-30

// 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がよく使われるのは以下の三つ

  1. 記号定数の定義
  2. 関数マクロ
  3. 条件付きコンパイル

記号定数の定義

  • 他の言語でいうところの、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でヘッダファイルを定義すると自動でこの一文が挿入される

8
7
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
7