0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【C】初めてのC言語(23. 条件付きコンパイル)

Last updated at Posted at 2022-11-13

はじめに

  • これまでの学習に続いて、今回はdefineとifdef~endifを用いた条件付きコンパイルについて学んだ結果をまとめてみました。

学習環境

  • 今回はpaiza.ioのC言語のエディタを使いました。

defineによるマクロ処理(復習)

マクロ処理の概要

  • defineによるマクロ処理は、「ソースコード内のある文字列を別の文字列に置換する」という機能を持っています。
    • この置換処理のことを「展開」と呼ぶそうです。
  • 以下のコードでは、プリプロセッサによって「PIが3.1415に置き換えられる」という処理が行われます。
Main.c
#include <stdio.h>

#define PI 3.1415

int main(void){
    int r = 2;
    printf("半径%dの円の面積:%f\n", r, r * r * PI);
    return 0;
}
実行結果
半径2の円の面積:12.566000

マクロ処理の副作用

  1. 型や構文のチェックが効かない。
  2. 危険な定数展開をしてしまうリスクがある。
    • 予約語の「int」を別のものに置換してしまうなどのリスクがあります。

ソースコード分岐処理とdefine

  • ここまでdefineによるマクロ処理を見ると良いことが無いように思えますが...
  • ifdef~endifによるソースコード分岐処理と組み合わせて使うと「条件に合致する時にのみコンパイル対象となるコードを記述する」ということが可能になります。
    • そういえばifdef~を使って、Windows用とLinux用の処理を分岐させているコードを見たような気が...
Main.c
#include <stdio.h>

#define DEBUG_MODE 5

int main(void){

int x = 0;

// DEBUG_MODEが宣言されている時に有効
#ifdef DEBUG_MODE
    printf("デバッグモードです。\n");
#endif

// DEBUG_MODEが宣言されていない時に有効
#ifndef DEBUG_MODE
    printf("リリースモードです。\n");
#endif


#if (DEBUG_MODE==1)
    x=1;
#elif (DEBUG_MODE==2)
    x=2;
#elif (DEBUG_MODE==3)
    x=3;
#else
    x=9;
#endif

    printf("%d\n", x);
    return 0;
}
実行結果
デバッグモードです。
9

補足:これまでの学習の歩み

参考URL

0
0
3

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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?