小白学开发(iOS)基础C_预处理指令(2015-07-20)
2015-07-21 12:38
363 查看
//
// main.c
// 宏定义
//
// Created by admin on 15/7/20.
// Copyright (c) 2015年 admin. All rights reserved.
//
#include <stdio.h>
/*
0. 预处理指令:在程序编译之前处理的指令,C语言的预处理指令只要有三个方面的内容:
》宏定义
》文件包含
》条件编译
说明: 预处理指令都以符号“#” 开头
预处理指令定义后面都不加分号
*/
/*
1. 宏定义:实际上就是做单纯的替换,即程序编译之前将会替换
分类:不带参数的宏定义 和 带参数的宏定义
说明:关键字是 #denfine
宏名一般都大写, 如果不全大写应在前面加上一个k
*/
int main(int argc, const char * argv[]) {
/*
1.1 不带参数的宏定义:
*/
#define LENGTH 3 // 宏定义后不需要加分号!
int array[LENGTH] = {1, 2, 3}; // 这里LENGTH就是3
for (int i = 0; i < LENGTH; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
// 提前结束宏定义的作用范围
#undef LENGTH
// int num = LENGTH; //这里赋值是错误的
// printf("num = %d", LENGTH);
/*
1.2带参数的宏定义
说明: ()里面的参数不需要写类型
()和后面要替换的内容之间一定有要空格
使用场合: 宏定义的效率比较高,可以做一些简单的运算操作,复杂的运算不行
*/
#define SUM(v1, v2) (v1 + v2) // 带两个参数v1和v2, 这里不需要写参数类型
#define PF(v) (v * v) // 这种定义是有问题的 参数复杂会出现计算错误,就是下面第三个例子
int a = 2;
int b = 3;
int result = SUM(a, b);
printf("result = %d\n", result);
int result1 = PF(a);
printf("result1 = %d\n", result1);
int result2 = PF(a + b); // 这里预想应输出:25 但实际输出是:result2 = 11
printf("result2 = %d\n", result2); // 出现了计算错误,实际计算步骤为:a + b * a + b
// 因此为保证计算正确 定义时应为 #define PF(v) ((v) * (v))
// 使用括号提升计算优先级,保证计算正确
return 0;
}
//
// main.c
// 多条件编译
//
// Created by admin on 15/7/20.
// Copyright (c) 2015年 admin. All rights reserved.
//
#include <stdio.h>
#define A 2
int main(int argc, const char * argv[]) {
/*
1. 条件编译: 有些语句希望在条件满足时才编译
*/
#if A == 1
printf("123\n");
#elif A == 2
printf("456\n");
#else
printf("789\n");
#endif // 结束标识 必须要有
/*
2. 真实开发中,使用场景
*/
#if A ==1
#define AAA "test"
#else
#define AAA "yonghu"
#endif
printf("AAA = %s\n", AAA);
#ifdef A // 如果定义了宏。。
printf("定义了宏A\n");
#endif
#ifndef A // 如果没有定义宏。。
printf("没有定义宏A\n");
#endif
// 一下两个形式和上面两个是等价的
#if defined(A)
printf("定义了宏A\n");
#endif
#if !defined(A)
printf("没有定义宏A\n");
#endif
return 0;
}
//
// main.c
// 文件包含
//
// Created by admin on 15/7/20.
// Copyright (c) 2015年 admin. All rights reserved.
//
#include <stdio.h>
// 文件包含后,不会参与编译,仅仅是用来被拷贝到这个文件
#include "xjx.h"
// 这里仅将xjx.h文件中的内容拷贝过来
int main(int argc, const char * argv[]) {
int i = 10;
int j = 20;
int result = sum(i, j);
printf("result = %d", result);
// 这里main.m文件中没有声明和定义 sum函数,文件包含后可直接引用
// 注意: > 文件包含中有双引号和尖括号两种形式,这两中形式只是表示系统
// 搜索文件的路径顺序不同 通常系统文件用< > 自定义文件用 “”
// > 文件不能相互包括,这样会造成死循环
return 0;
}
// main.c
// 宏定义
//
// Created by admin on 15/7/20.
// Copyright (c) 2015年 admin. All rights reserved.
//
#include <stdio.h>
/*
0. 预处理指令:在程序编译之前处理的指令,C语言的预处理指令只要有三个方面的内容:
》宏定义
》文件包含
》条件编译
说明: 预处理指令都以符号“#” 开头
预处理指令定义后面都不加分号
*/
/*
1. 宏定义:实际上就是做单纯的替换,即程序编译之前将会替换
分类:不带参数的宏定义 和 带参数的宏定义
说明:关键字是 #denfine
宏名一般都大写, 如果不全大写应在前面加上一个k
*/
int main(int argc, const char * argv[]) {
/*
1.1 不带参数的宏定义:
*/
#define LENGTH 3 // 宏定义后不需要加分号!
int array[LENGTH] = {1, 2, 3}; // 这里LENGTH就是3
for (int i = 0; i < LENGTH; i++) {
printf("array[%d] = %d\n", i, array[i]);
}
// 提前结束宏定义的作用范围
#undef LENGTH
// int num = LENGTH; //这里赋值是错误的
// printf("num = %d", LENGTH);
/*
1.2带参数的宏定义
说明: ()里面的参数不需要写类型
()和后面要替换的内容之间一定有要空格
使用场合: 宏定义的效率比较高,可以做一些简单的运算操作,复杂的运算不行
*/
#define SUM(v1, v2) (v1 + v2) // 带两个参数v1和v2, 这里不需要写参数类型
#define PF(v) (v * v) // 这种定义是有问题的 参数复杂会出现计算错误,就是下面第三个例子
int a = 2;
int b = 3;
int result = SUM(a, b);
printf("result = %d\n", result);
int result1 = PF(a);
printf("result1 = %d\n", result1);
int result2 = PF(a + b); // 这里预想应输出:25 但实际输出是:result2 = 11
printf("result2 = %d\n", result2); // 出现了计算错误,实际计算步骤为:a + b * a + b
// 因此为保证计算正确 定义时应为 #define PF(v) ((v) * (v))
// 使用括号提升计算优先级,保证计算正确
return 0;
}
//
// main.c
// 多条件编译
//
// Created by admin on 15/7/20.
// Copyright (c) 2015年 admin. All rights reserved.
//
#include <stdio.h>
#define A 2
int main(int argc, const char * argv[]) {
/*
1. 条件编译: 有些语句希望在条件满足时才编译
*/
#if A == 1
printf("123\n");
#elif A == 2
printf("456\n");
#else
printf("789\n");
#endif // 结束标识 必须要有
/*
2. 真实开发中,使用场景
*/
#if A ==1
#define AAA "test"
#else
#define AAA "yonghu"
#endif
printf("AAA = %s\n", AAA);
#ifdef A // 如果定义了宏。。
printf("定义了宏A\n");
#endif
#ifndef A // 如果没有定义宏。。
printf("没有定义宏A\n");
#endif
// 一下两个形式和上面两个是等价的
#if defined(A)
printf("定义了宏A\n");
#endif
#if !defined(A)
printf("没有定义宏A\n");
#endif
return 0;
}
//
// main.c
// 文件包含
//
// Created by admin on 15/7/20.
// Copyright (c) 2015年 admin. All rights reserved.
//
#include <stdio.h>
// 文件包含后,不会参与编译,仅仅是用来被拷贝到这个文件
#include "xjx.h"
// 这里仅将xjx.h文件中的内容拷贝过来
int main(int argc, const char * argv[]) {
int i = 10;
int j = 20;
int result = sum(i, j);
printf("result = %d", result);
// 这里main.m文件中没有声明和定义 sum函数,文件包含后可直接引用
// 注意: > 文件包含中有双引号和尖括号两种形式,这两中形式只是表示系统
// 搜索文件的路径顺序不同 通常系统文件用< > 自定义文件用 “”
// > 文件不能相互包括,这样会造成死循环
return 0;
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 如何成为一名专家级的开发人员
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- AS3自写类整理笔记 ClassLoader类第1/2页
- AS3自写类整理笔记 Dot类第1/2页
- DB2新手使用的一些小笔记:新建实例、数据库路径不存在、客户端连接 .
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- perl脚本学习指南--读书笔记
- C语言内存对齐实例详解
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- 探讨C语言的那些小秘密之断言