ITメモ
C言語 / Programming Language C
開発環境 / Development Environment
【Mac】Xcode【Win】Visual Stadio
基礎 / Basic
About C言語書式コメントコンパイルとリンクメイクファイル / Makefileヘッダファイル変数定数型 / Type配列 / Arrayポインタ / Pointer演算子 / Operator制御文 / Control Statement関数指定子 / 修飾子構造体と共用体 / Structure & Unionプリプロセッサ / PreprocessorthisキーワードTypedef
入出力 / Input & Output
入出力入力フォーマット指定子出力フォーマット指定子「printf」関数を使って文字を出力・表示させる方法「printf_s」関数を使って文字を出力・表示させる方法「scanf」関数を使って入力させる方法「scanf_s」関数を使って入力させる方法「getchar」関数を使って「1文字」だけ入力させる方法「gets」関数を使って「文字列」を入力させる方法
文字列 / String
文字列 / String「snprintf」関数で「配列」に文字列を書き込む方法
ネットワーク / Network
memset - メモリブロックのセット
メモリー管理
メモリー
オペレーション / Operation
ファイルを操作をする方法コマンドラインプログラム / Command-Line Programプロセス / Processソケット通信 / Socket Communication
用語集 / Glossary
サブルーチン / Subroutineスタックとキュー / Stack & Cueスレッド / Thread
C言語標準ライブラリ(ヘッダファイル)
C言語標準ライブラリ【assert.h】 - 診断機能【complex.h】 - 複素数計算【ctype.h】 - 文字操作【errno.h】 - エラー【fenv.h】 - 浮動小数点環境【float.h】 - 浮動小数点型の特性【inttypes.h】 - 整数型の書式の変換【iso646.h】 - 代替つづり(Alternate spellings)【limits.h】 - 整数型の大きさ【locale.h】 - 文化圏固有操作【math.h】 - 数学【setjmp.h】 - 非局所分岐【signal.h】 - シグナル操作【stdalign.h】 - アライメント【stdarg.h】 - 可変個数の実引数【stdatomic.h】 - アトミック操作【stdbool.h】 - 論理型および論理値【stddef.h】 - 共通の定義【stdint.h】 - 整数型【stdio.h】 - 入出力【stdlib.h】 - 一般ユーティリティ【stdnoreturn.h】 - _Noreturn【string.h】 - 文字列操作【tgmath.h】 - 型総称数学関数(Type-generic math)【threads.h】 - マルチスレッド【time.h】 - 日付及び時間【uchar.h】 - Unicodeユーティリティ【wchar.h】 - 多バイトおよびワイド文字拡張ユーティリティ【wctype.h】 - ワイド文字種分類およびワイド文字大文字小文字変換ユーティリティ
C言語ライブラリ(ヘッダファイル)
C言語ヘッダファイル【winsock.h】





【C言語】プリプロセッサ / Preprocessor

【C言語】
プリプロセッサ / Preprocessor







プリプロセッサとは


「プリプロセッサ」は、
ソフトウェアの分類の一つで、
プログラミングコードを実行する前に、
前処理を行うプログラミング。


「コンパイラ」に
コンパイル方法を伝達する役割を持っている
重要なプログラミングの一つ。

前処理の「プリプロセッサ」と同じく、
メインの処理の後に、
後処理を行うプログラミングを
「ポストプロセッサ(postprosessor)」という。




Back

「プリプロセッサ」の種類


「プリプロセッサ」には、 いくつかの種類があり、
それぞれを駆使して、
「コンパイラ」に「コンパイル」の方法を指示します。


「C言語」では、
「#ifndef」「#define」「#endif」を使ったコードが定番。



msdn「プリプロセッサ」 - (マイクロソフトのライブラリ)
http://msdn.microsoft.com/ja-jp/library/3sxhs2ty.aspx


> 「プリプロセッサ」の種類
プリプロセッサ説明
#defineマクロ定義
#error
#import
#undef
#etdf
#if条件分岐
#include読み込むヘッダファイルを指定する
#using
#else条件分岐で指定した内容と異なる場合の処理を記述する
#ifdef定数として定義されていれば実行する条件分岐
#tdne
#endif「if」が付く条件分岐の範囲を終了とするマーク
#ifndef定数として定義されていなければ実行する条件分岐
#pragmaプラグマは、コンパイル時に、コンパイラの設定を一時的に変更したいときなどに使用。


Back

「#if」の使い方




「#if」を使った書式
#if 条件式1
条件式1が「真」のときに実行されるコード
#elif 条件式2
条件式2が「真」のときに実行されるコード
#else
条件式1と条件式2の両方が「偽」となるときのコード
#endif


Back

「#ifdef」の使い方


「#ifdef マクロ名 ~ #else ~ #endif」は、
マクロが定義されていたならば、
「#ifdef」と「#else」の間が実行され、
「#else」と「#endif」 の間は、
マクロが定義されていない場合に実行される。

「#else」がない場合は、
「#endif」までの間が実行される。


マクロが定義されていないならば、
「#else」と「#endif」の間の行が有効となり、コンパイルされる。


「#ifndef マクロ名 ~ #else ~ #endif」は、
「#ifdef」とは逆の意味になり、
「マクロ名」が、「#define」で定義されてない時にかぎり、
「#ifndef」マクロ名 と「#else」の間が有効となり、
コンパイルが実行される。
マクロが定義されているならば、
「#else」と「#endif」の間の行が有効となり、
コンパイルが実行される。


プリプロセッサディレクティブの構文
条件式に「 defined 」
マクロが定義されているかどうかを判定する。
記述方法は、下記のように複数ある。

#ifdef A
#if defined(A)
#ifndef  A
#if !defined(A)



「#ifdef」を使った書式

#ifdef マクロ名
マクロ名が「#define」で定義されている時に記述内容を実行する
#else
マクロ名が「#define」で定義されていない時に記述内容を実行する
#endif





#ifndef マクロ名
マクロ名が「#define」で定義されていない時に記述内容を実行する
#else
マクロ名が「#define」で定義されている時に記述内容を実行する
#endif



Back

「#include」の使い方


#include

ヘッダファイルの呼び込み
#include <header.h>
ヘッダファイル保存ディレクトリからヘッダファイルを探す
#include "header.h"
カレントディレクトリをまず探し、その後、ヘッダファイル保存ディレクトリから探す。


Back

「#define」の使い方


#define は 文字列1 を文字列2 で置き換える
#define = 「マクロ定義」
単に定数の「6」を用いるよりも、「NINZU」とマクロ定義した方が意味がわかりやすくなる。
プログラムの変更が生じ、学生数が「6」から他の数値になったときに、#define 定義を修正するだけで対応できる。
記号定数は他の変数と区別するために大文字で記述するとよい。
文字列2 の部分には、既にマクロ定義されている記号定数を用いることもできる。



「#define」の記述方法
構文
#define 文字列1 文字列2
ーーー「文字列1」を記号定数とも呼ぶ

#difine sample01 sample02
ーーー「sample01」と記述すると、「sample02」と記述したことになる。


Back

「#pragma」の使い方


  • プラグマは、コンパイル時に、コンパイラの設定を一時的に変更したいときなどに使用。
  • どのようなコマンドが使用できるかは、コンパイラに依存する。
  • コンパイラが対応していないプラグマは、無視される。


#pragma コマンド
#pragma once
ヘッダファイルの先頭に記述。
そのヘッダファイルは、一度だけしかインクルードされないようになる。


Back

「#paragmamessage」の使い方


「#paragmamessage」は、
ビルド時にメッセージを出す「プリプロセッサ」。


「#paragmamessage」の書式
#paragmamessage("メッセージ")


Back

「#error」の使い方


「#error」は、
「ビルドエラー」時にしたい表示したい内容を記述する「プリプロセッサ」。



#error "エラーメッセージ"


Back

コンパイラ定義済みのマクロ




__cplusplus C++のときに定義される
_MSC_VER Visual C++のときに定義される。コンパイラのバージョン
__APPLE__ Mac OS XのGCCやLLVMで定義される。
__linux__ LinuxのGCCで定義される。


Back