热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

IOS开发学习笔记008预处理

预处理1、宏定义2、条件编译3、文件包含注意:1、所有预处理都是以#开头,并且结尾不用分号.2、宏名一般用大写字母,以便与变量名区别开来&
预处理

 1、宏定义

 2、条件编译

 3、文件包含

注意:

  1、所有预处理都是以#开头,并且结尾不用分号.

  2、宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误

  3、作用域也是从定义到代码块结束

  4、定义一个宏时可以引用已经定义的宏名

  5、在编译预处理用字符串替换宏名时,不作语法检查,只是简单的字符串替换。只有在编译的时候才对已经展开宏名的源程序进行语法检查

一、宏定义

  1、不带参数的宏定义

  #define 宏名 字符串

  #define COUNT 6  

  2、带参数的宏定义

  #define 宏名(参数列表) 字符串

  #define sum(va,vb) ((va)+(vb))

  注意:每个参数都要加括号,运算结果也要加括号

若需要提前取消宏定义可用 #undef COUNT实现。

  代码示例

1 //宏名一般用大写字母,以便与变量名区别开来,但用小写也没有语法错误
2 //1、宏定义1,不带参数的宏定义,常用来定义常量
3 #define COUNT 6//后面么有';'
4
5 #include
6 //1、宏定义2,带参数的宏定义,每个参数都要加括号,运算结果也要加括号
7 #define sum(v1,v2) ((v1)+(v2))
8
9
10 int main()
11 {
12 //1、宏定义使用
13 int array[COUNT] = {1,2,3,4,5,6};
14 for (int i = 0; i )
15 {
16 printf("%d ",array[i]);
17 }
18 #undef COUNT //提前取消宏定义
19 //带参数的宏
20 printf("\n%d\n",sum(10,20));
21 printf("%d\n",sum(3,3)*sum(4,4));//这样实际运行效果是3+3*4+4=19,因为宏只是简单的文本替换,所以定义时加()比较好
22
23 //2、条件编译
24
25
26 return 0;
27 }

 

二、条件编译

满足条件就对代码进行编译,否则不编译。

#if 条件1

 .....

#elif 条件

  ......

#else

  .....

#endif//不可缺少

 

1 #define COUNT 6//后面么有';'
2 //2、条件编译,一般判断宏的值,不能对变量进行操作
3 #if(COUNT == 6)
4 printf("条件编译:%d\n",COUNT);
5 #elif (COUNT == 4)
6
7 #else
8
9 #endif//不可缺少

#if defined()和#if !defined()的使用

#if defined(COUNT)//COUNT是一个宏,如果定义这个宏就执行下面的代码
...code...
#endif

#if !defined(COUNT)//COUNT是一个宏,如果没有定义这个宏就执行下面的代码
...code...
#endif

代码:

1 //#if defined()和#if !defined()的用法
2 #if defined (COUNT)//如果定义宏就编译下面代码,否则不编译
3 printf("defined:%d\n",COUNT);
4 #endif
5
6 #if !defined (COUNT1)//如果定义宏就编译下面代码,否则不编译
7 printf("! defined\n");
8 #endif

 

 

#ifdef和#ifndef的使用

#ifdef COUNT//COUNT是一个宏,如果定义这个宏就编译下面的代码...code...
#endif

#ifndef COUNT//COUNT是一个宏,如果没有定义这个宏就编译下面的代码...code...
#endif

代码:

1 //#ifdef和#ifndef的使用
2 #ifdef COUNT//如果定义宏就编译下面代码,否则不编译
3 printf("ifdef:%d\n",COUNT);
4 #endif
5
6 #ifndef COUNT1//如果定义宏就编译下面代码,否则不编译
7 printf("ifndef\n");
8 #endif

 

三、文件包含

#include

#include <>//系统头文件

#include ""//自定义的头文件

文件包含可能会重复包含同一个文件&#xff0c;这是可以再要包含的文件中添加一个宏定义&#xff0c;用于消除重复包含。

格式如下  

  #ifndef A_H

  #def A_H

    ..........

  #endif

这样即使多次#include同一个头文件也不会产生文件的重复性包含

 四、typedef 

 typedef的用法:

   1、为各种数据类型定义一个新名字(别名)

   2、typedef与指针

   3、typedef与结构体

   4、typedef与指向结构体的指针

   5、typedef与枚举类型

   6、typedef与指向函数的指针

   7、typedef与#define

代码示例

1 #include
2 /*
3 typedef的用法:
4 1、为各种数据类型定义一个新名字(别名)
5 2、typedef与指针
6 3、typedef与结构体
7 4、typedef与指向结构体的指针
8 5、typedef与枚举类型
9 6、typedef与指向函数的指针
10 7、typedef与#define
11 */
12
13 //3、typedef与结构体
14 struct Point
15 {
16 int x;
17 int y;
18 };
19
20 //也可以直接在定义时使用typedef
21 typedef struct Point1{}point1;
22
23 //起别名&#xff0c;下面可以直接使用&#xff0c;而不用每次都写struct
24 typedef struct Point MyPoint;
25
26 //自定义结构体指针&#xff0c;起别名
27 typedef MyPoint *pp;
28
29
30
31 // 5、typedef与枚举类型
32 enum Sex{male,female,notSure};
33 typedef enum Sex Sex;//起别名
34
35 // 6、typedef与指向函数的指针
36 int Sum(int a,int b)
37 {
38 int c &#61; a &#43; b;
39 printf("%d &#43; %d &#61; %d\n",a,b,c);
40 return c;
41 }
42
43
44
45 int main()
46 {
47 //1、为各种数据类型定义一个新名字(别名)
48 typedef int Integer;
49
50 Integer i &#61; 10;
51 printf("%d\n",i);
52
53 //1、typedef与指针
54 typedef char *String;
55 String name &#61; "this is a typedef struct";
56 printf("%s\n",name);
57
58 //3、typedef与结构体
59 MyPoint p1;
60 p1.x &#61; 1;
61 p1.y &#61; 2;
62 printf("%d,%d\n",p1.x,p1.y);
63
64 //4、typedef与指向结构体的指针
65 pp p &#61; &p1;
66 p->x &#61; 10;
67 p->y &#61; 20;
68 printf("%d,%d\n",p->x,p->y);
69
70 // 5、typedef与枚举类型
71 Sex s1 &#61; male;//使用别名进行变量声明&#xff0c;不用带关键字enum
72 printf("%d\n",s1);
73
74 // 6、typedef与指向函数的指针
75 //普通函数指针使用方式
76 int (*pSum)(int ,int );//普通函数指针定义
77 pSum &#61; &Sum;
78 (*pSum)(19,20);
79
80 typedef int (*pS)(int ,int );//使用typedef给函数指针起别名
81 pS ps &#61; ∑//这个使用方式和上面有些差别
82 (*ps)(19,20);
83
84 //7、typedef与#define
85 #define String1 char*
86 typedef char* String2;
87 String1 str1,str2;//宏替换 char* str1,str2;//str2只是一个字符变量&#xff0c;不是指针变量
88 String2 str3,str4; //但是这个是这样&#xff0c;char *str3&#xff1b;char * str4;
89
90 return 0;
91 }

static和extern

static和extern与函数

  关于函数&#xff1a;

  外部函数&#xff1a;如果在当前文件中定义的函数允许其他文件访问、调用&#xff0c;就称为外部函数。C语言规定&#xff0c;不允许有同名的外部函数。

  内部函数&#xff1a;如果在当前文件中定义的函数不允许其他文件访问、调用&#xff0c;只能在内部使用&#xff0c;就称为内部函数。C语言规定不同的源文件可以有同名的内部函数&#xff0c;并且互不干扰。

 

one.h

//one.h

#include
"one.c"extern void one();
void anotherOne();

one.c

1 //one.c
2
3
4 #include
5
6 extern void one()//默认就是extern函数&#xff0c;不写效果一样。外部函数
7 {
8 printf("one is called&#xff01;\n");
9 }
10 static void anotherOne()//只能在one.c中使用。内部函数
11 {
12 printf("anotherOne is called&#xff01;\n");
13 }

主函数

1 #include
2 //#include "one.h"
3 /*
4 extern与static
5 1、extern与函数&#61;&#61;外部函数
6 2、static与函数&#61;&#61;内部函数
7 */
8
9 //1、extern与函数
10 //#include "one.c"//这样引用会提示重复定义one
11 //extern void one();//可以这样进行外部声明&#xff0c;但是extern可以省略&#xff0c;所以可以直接写成 void one()&#xff1b;
12 //实际情况下一般把声明写道头文件里&#xff0c;直接包含头文件&#xff0c;可以直接使用里面的函数
13 // 2、static与函数
14 //只能再定义的文件内使用&#xff0c;无法被外部文件引用
15
16 void anotherOne();//引用声明
17
18 int main()
19 {
20 one();
21 anotherOne();
22 return 0;
23 }

 

static和extern与全局变量

1、全局变量可以重复定义&#xff0c;只要变量名一样&#xff0c;指的都是一个变量&#xff0c;在多个文件中也是如此。

  int b1;

  int b1;

  int b1;

2、如果变量的定义在下面&#xff0c;但是又想提前使用就需extern声明

  extern int a;

3、在函数内部也可以通过extern int a;使用全局变量a&#xff0c;以区别同名的局部变量

4、全局静态变量&#xff0c;只能在本文件内部使用

1 #include
2 //3、全局变量和static
3 static int b;//全局静态变量&#xff0c;只能在本文件内部使用
4 //全局变量可以重复定义&#xff0c;只要变量名一样&#xff0c;指的都是一个变量&#xff0c;在多个文件中也是如此。
5 int b1;
6 int b1;
7 int b1;
8 // 4、全局变量和extern
9 extern int a;//a的定义在下面或者在其他文件里&#xff0c;如果想提前使用就需extern声明
10
11 int main()
12 {
13 {
14 //在函数内部访问同名全局变量1
15 extern int b1;
16 b1 &#61; 12;
17 }
18 //在函数内部访问同名全局变量2
19 int *p &#61; &b1;
20
21 int b1;
22 b1 &#61; 20;
23
24
25 return 0;
26 }
27
28 int a;

 

 

 

2015-4-14 今日如此&#xff0c;明日依旧。

转:https://www.cnblogs.com/songliquan/p/4425706.html



推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 本文介绍了一个程序,可以输出1000内能被3整除且个位数为6的所有整数。程序使用了循环和条件判断语句来筛选符合条件的整数,并将其输出。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了PE文件结构中的导出表的解析方法,包括获取区段头表、遍历查找所在的区段等步骤。通过该方法可以准确地解析PE文件中的导出表信息。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
author-avatar
轰炸籹厕所744
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有