【黒馬プログラマー】iOS学習の道——C言語のマクロ定義、条件コンパイルと条件含みとtypedef
11079 ワード
---Javaトレーニング、Androidトレーニング、iOSトレーニング、.Netトレーニング、ご交流をお待ちしております!------
一、前処理指令の概要
1.C言語は、ソースプログラムをコンパイルする前に、いくつかの特殊な前処理命令(例えば、以前使用していた#includeファイルに命令が含まれている)を解釈し、新しいソースプログラム(このプロセスをコンパイル前処理と呼ぶ)を生成し、その後、通常のコンパイルを行う.
2.前処理命令と一般的なC文を区別するために、すべての前処理命令は記号「#」で始まり、最後にセミコロンを使わない
3.前処理命令は、プログラムの任意の場所に表示され、その作用範囲は、その出現位置からファイルの最後までである.ソース・プログラムの先頭にできるだけ前処理命令を書くことに慣れています.この場合、その役割範囲はソース・プログラム・ファイル全体です.
4.C言語で提供される前処理命令は主にマクロ定義、ファイル含む、条件コンパイルである.
二、パラメータを持たないマクロ定義
一、前処理指令の概要
1.C言語は、ソースプログラムをコンパイルする前に、いくつかの特殊な前処理命令(例えば、以前使用していた#includeファイルに命令が含まれている)を解釈し、新しいソースプログラム(このプロセスをコンパイル前処理と呼ぶ)を生成し、その後、通常のコンパイルを行う.
2.前処理命令と一般的なC文を区別するために、すべての前処理命令は記号「#」で始まり、最後にセミコロンを使わない
3.前処理命令は、プログラムの任意の場所に表示され、その作用範囲は、その出現位置からファイルの最後までである.ソース・プログラムの先頭にできるだけ前処理命令を書くことに慣れています.この場合、その役割範囲はソース・プログラム・ファイル全体です.
4.C言語で提供される前処理命令は主にマクロ定義、ファイル含む、条件コンパイルである.
二、パラメータを持たないマクロ定義
1.
#define
#define ABC 10
, #define ABC
2.
, " " " ", 。
#include
// PI 3.14
#define PI 3.14
// radius
float girth(float radius) {
return 2 * PI *radius;
}
int main ()
{
float g = girth(2);
printf(" :%f", g);
return 0;
}
4 PI , , 8 2 * PI *radius 2 * 3.14 * radius。
3.
1> , ,
2> , 。 :
#define R 10
int main ()
{
char *s = "Radio";
return 0;
}
1 R , 4 "Radio" 'R' 10
3> , , 。
#define I 100
int main ()
{
int i[3] = I;
return 0;
}
, , 4 I 100。 4 。
4> 。 , #undef
#define PI 3.14
/*
.
.
.
.
*/
#undef PI
PI 1 8 , 8
5>
#define R 3.0
#define PI 3.14
#define L 2*PI*R
#define S PI*R*R
三、パラメータ付きマクロ定義1.
#define ( )
2.
, ,
#include
#define average(a, b) (a+b)/2
int main ()
{
int a = average(10, 4);
printf(" :%d", a);
return 0;
}
3 2 average, 7 :int a = (10 + 4)/2;, :。 ?
3.
1> ,
#define average (a, b) (a+b)/2
int main ()
{
int a = average(10, 4);
return 0;
}
1 , average (a, b) , , 5 :
int a = (a, b) (a+b)/2(10, 4);
2> , , 。 , 。
D(a), a 2 :
#include
#define D(a) 2*a
int main ()
{
int b = D(3+4);
printf("%d", b);
return 0;
}
7 int b = 2*3+4;, :
, 3 :
#define D(a) 2*(a)
a , 7 int b = 2*(3+4);, :
3>
P(a), a :
#include
#define Pow(a) (a) * (a)
int main(int argc, const char * argv[]) {
int b = Pow(10) / Pow(2);
printf("%d", b);
return 0;
}
3 , , 。 6 :
int b = (10) * (10) / (2) * (2);
:int b = 10 * (10 / 2) * 2;, b :
3 :
#define Pow(a) ( (a) * (a) )
6 :
int b = ( (10) * (10) ) / ( (2) * (2) );
:int b = (10 * 10) / (2 * 2);, :。 。
5.
, , 。 :
1> 、 、 、
2> , 。
四、条件コンパイル , , ( ), 。
、
#if 1
...code1...
#elif 2
...code2...
#else
...code3...
#endif
1> 1 , #if #elif code1 ( : , , if-else )
2> 1 、 2 , #elif #else code2
3> 1、2 , #else #endif code3
4> , , #endif, ( )
5> #if #elif , , , 、
、
#include
#define MAX 11
int main ()
{
#if MAX == 0
printf("MAX 0");
#elif MAX > 0
printf("MAX 0");
#else
printf("MAX 0");
#endif
return 0;
}
3 MAX, MAX , , main 。 7 13 。
MAX 11, #elif , 10 , :
/*stdio.h #include */
int main ()
{
printf("MAX 0");
return 0;
}
, :
、
1.#if defined() #if !defined()
#if #elif , 。 :
#if defined(MAX)
...code...
#endif
MAX , code 。 MAX , MAX, 。
:
#if !defined(MAX)
...code...
#endif
MAX , code 。
2.#ifdef #ifndef
* #ifdef #if defined()
#ifdef MAX
...code...
#endif
MAX , code 。
* #ifndef #if !defined()
#ifndef MAX
...code...
#endif
MAX , code 。
五、ファイルは含む 、
, #include, 。
、
1. 1 #include
C
2. 2 #include " "
, , path , C
、
1.#include , a.h b.h,b.h c.h, , a.h b.h,b.h a.h。
2. #include ,
one.h one ; two.h one.h, two 。( , )
main.c one two , two.h one.h, :
main.c :
void one();
void one();
void two();
int main ()
{
return 0;
}
1 #include "one.h" , 2、3 #include "two.h" ( two.h one.h)。 ,one 2 , , 。
, :
, one.h : #include "one.h" , _ONE_H_, 9 , 10 _ONE_H_ , 13 one , 15 。 #include "one.h", _ONE_H_ , 9 , 15 #endif, 。 3 , one.h 。
,main.c :
#include "one.h"
#include "two.h"
:
// #include "one.h"
#ifndef _ONE_H_
#define _ONE_H_
void one();
#endif
// #include "two.h"
#ifndef _TWO_H_
#define _TWO_H_
// #include "one.h"
#ifndef _ONE_H_
#define _ONE_H_
void one();
#endif
void two();
#endif
2~ 7 #include "one.h" , 10~ 23 #include "two.h" 。 :
void one();
void two();
六、typedefキーワード 、typedef
typedef ( )。
#include
typedef int Integer;
typedef unsigned int UInterger;
typedef float Float;
int main(int argc, const char * argv[]) {
Integer i = -10;
UInterger ui = 11;
Float f = 12.39f;
printf("%d %d %.2f", i, ui, f);
return 0;
}
3、 4、 6 int、unsigned int、float , main , 。 :
, , int、float :
int i = 10;
float f = 10.0f;
*
typedef int Integer;
typedef Integer MyInteger;
、typedef
,typedef
#include
typedef char *String;
int main(int argc, const char * argv[]) {
// char *str = "This is a string!";
String str = "This is a string!";
printf("%s", str);
return 0;
}
3 char * String, 7 String , Java ?
、typedef
1.
//
struct MyPoint {
float x;
float y;
};
int main(int argc, const char * argv[]) {
//
struct MyPoint p;
p.x = 10.0f;
p.y = 20.0f;
return 0;
}
, struct , 9
2. typedef
//
struct MyPoint {
float x;
float y;
};
//
typedef struct MyPoint Point;
int main(int argc, const char * argv[]) {
//
Point p;
p.x = 10.0f;
p.y = 20.0f;
return 0;
}
8 MyPoint Point, 12 Point p, struct
1~ 8 :
// ,
typedef struct MyPoint {
float x;
float y;
} Point;
:
typedef struct {
float x;
float y;
} Point;
、typedef
typedef 、 ,
#include
//
typedef struct {
float x;
float y;
} Point;
//
typedef Point *PP;
int main(int argc, const char * argv[]) {
//
Point point = {10, 20};
//
PP p = &point;
//
printf("x=%f,y=%f", p->x, p->y);
return 0;
}
4 , Point, 10 PP。 main 2 。
:
、typedef
typedef 。
//
enum Season {spring, summer, autumn, winter};
//
typedef enum Season Season;
int main(int argc, const char * argv[]) {
//
Season s = spring;
return 0;
}
2 , 4 Season, 8 , enum 。
1 ~ 4 :
// ,
typedef enum Season {spring, summer, autumn, winter} Season
, :
typedef enum {spring, summer, autumn, winter} Season;
、typedef
1.
#include
// sum , a b
int sum(int a, int b) {
int c = a + b;
printf("%d + %d = %d", a, b, c);
return c;
}
int main(int argc, const char * argv[]) {
// sum p
int (*p)(int, int) = sum;
// p sum
(*p)(4, 5);
return 0;
}
* 4 sum , 12 sum p, , p , 。
* 15 p sum , :
2. , typedef
#include
// sum , a b
int sum(int a, int b) {
int c = a + b;
printf("%d + %d = %d", a, b, c);
return c;
}
typedef int (*MySum)(int, int);
int main(int argc, const char * argv[]) {
// sum p
MySum p = sum;
// p sum
(*p)(4, 5);
return 0;
}
* 10 , : , MySum, 2 int , int 。
* 14 MySum sum p, 。 17 。
、typedef #define
1. ( 1 )
* 1
typedef char *String;
int main(int argc, const char * argv[]) {
String str = "This is a string!";
return 0;
}
* 2
#define String char *
int main(int argc, const char * argv[]) {
String str = "This is a string!";
return 0;
}
1 , : "This is a string!"。
:
1 typedef char * String
2 char * String
, typedef #define 。
2.
typedef char *String1;
#define String2 char *
int main(int argc, const char * argv[]) {
String1 str1, str2;
String2 str3, str4;
return 0;
}
1 char * String1, 2 String2。 6、 8 4 。
, : , str1、str2、str3 char ,str4 char 。
:
* int , :
int a, b;
:
int a;
int b;
*
typedef char *String1;
String1 str1, str2;
typedef ,String1 , 3
String1 str1;
String1 str2;
String1 char *,
char *str1;
char *str2;
*
#define String2 char *
String2 str3, str4;
, char * String2, 3
char * str3, str4;
:
char * str3;
char str4;
, str4 ,str1、str2、str3 。
, , typedef, #define