IOS学习入门准备-C—_3

不知道上篇的例子有没有朋友去试过,试过的朋友应该很疑惑,为什么会报错?

我们来编译几个文件看看头文件到底是如何导入的;

a.c

void hellow(){
 printf("hellow");
}

a.h

#include "b.h";
void hellow();

b.c

void word(){
 printf("word");
}

b.h

void word();

test.c

#inculde <stdio.h>
#inculde "a.h"
int main(){
    hellow();
    word();
}

接下来把test.c编译为预编译文件..gcc -E test.c -o

用记事本打开文件,前面代码先不管拉到最下方

可以看到我们写的代码..前面代码是什么呢   前面一大坨都是库文件<stdio.h>的代码,所以include导入文件可以理解为拷贝文件进来  往下看

# 1 "testA.h" 1 于是他把testA.h的所有代码拷贝进来了:

但是拷贝的时候又遇到testA.h内的 # 1 "testB.h" 1 于是把testB.h的所有代码也考进来就有了下面几句

# 1 "testB.h" 1
void word();

这时候testA还没拷贝完继续拷贝testA的第二行

void hellow();  当include都拷贝完了才会开始编译main函数。

在看上一篇的问题A.h包含B.h,B.h又包含A.h。。仔细想想预编译时会怎么样?

预编译到A.h 发现有一行#include "B.h"于是去拷贝B.h,又发现B.h有一行#include"A.h"又去拷贝A.h,造成无限循环...

那么如何解决这种问题呢?

#ifndef name

#define name

头文件内容

#endif

ifndef 是"if not defined"的简写宏定义的一种,它是可以根据是否已经定义了一个变量来进行分支选择

define 定义一个宏 endif 则是终止if

以下是个人对于头文件的一些理解和测试结果

1.当头文件引用自身或者相互引用时会出现死循环  提示循环过于深入
2.当A,B都包含C时编译可以通过  但预编译状态下可看到 C文件出现了两份  程序不会因此不能运行  但拖慢了程序的加载
3.当A,B中拥有重名的方法 并在主函数调用时会出现编译错误(不调用则编译通过)   未明确定义
4.C程序预编译时根据头文件查找目标文件(*.o),所以目标文件重新编译并不影响它所依赖的文件
5.解决头文件导入重复或循环问题
#ifndef _test_h_
#define _test_h_
头文件内容
#endif

---------------------------------------------------------------------------------------------------------------------------------

头文件就说到这里..之前有提到宏定义  宏定义是什么呢

#define A=3;  //这是定义一个宏有不少人认为这就是定义一个全局的常量,但是他与常量相似却又有所不同,他会把代码中所有A都替换成3但这个操作是在预处理阶段就进行了,

比如你在代码中写道  int sum=2+A;  那么预处理之后就变成了int sum=2+3;

而定义常量const a=3;则是由编译器进行处理和分配空间

这里顺便提一下宏定义函数  我们写个例子

#include <stdio.h>
#define SUM( a, b) (a*b)
int main(){
    int a=5;
    int b=6;
    int result=SUM(a+b,b+a);    printf("%d\n",result);
}

大胆的猜猜看输出结果是什么?

复制代码编译一次,结果是不是与想象中有所不同呢?

如果感到困惑请把它编译成预编译文件

仔细找找...宏定义函数是不是消失了?  是的 他用代码块替换掉了所有调用它的函数..这是宏定义函数比较有趣的一个地方

既然知道了原因,那么解决方式就一目了然了

#define SUM( a, b) ((a)*(b))这样编译输出的值就是你所期望的了
时间: 2024-10-05 14:03:30

IOS学习入门准备-C—_3的相关文章

这可能是最详细的 iOS 学习入门指南(含书目/文档/学习资料)

1 零基础小白如何进行 iOS 系统学习 首先,学习目标要明确: 其次,有了目标,要培养兴趣,经常给自己一些正面的反馈,比如对自己的进步进行鼓励,在前期小步快走: 再次,学技术最重要的一点就是多动手. 推荐书目: <Objective-C 基础教程> <iOS 编程> <iOS 开发指南> 推荐两个开源的 APP:SegmentFault.懒人笔记 2 基础入门后,如何进行高级进阶 2.1 原理和基础:掌握扎实的原理和基础是进阶的必要条件 首先是语言.入门时候可能只要对

转: ios学习入门进阶

著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.作者:利炳根链接:https://www.zhihu.com/question/19627420/answer/45962351来源:知乎 看视频:斯坦福大学公开课:iOS 7应用开发斯坦福大学公开课:iOS 8开发 看书OC <Objective-C编程:Big Nerd Ranch入门经典>([美]Aaron Hillegass)[摘要 书评 试读] iOS <iOS编程(第4版)>([美]Christian

IOS学习入门准备-C—_2

用命令行编译C文件我们已经知道了 简单谈一下他的编译过程.. 首先我们创建了test.c的C文件 也就是源文件, 接着预编译,再由编译器编译为汇编代码, 汇编器把汇编代码编译为目标文件(.o),最后由连接器把所有目标文件与库文件连接起来生成可执行文件 源文件->预编译文件->汇编代码文件->目标文件->链接后生成可执行文件: 下面学习头文件与实现文件的意义 我们都知道C语言编程第一行是什么呢 1 #include <stdio.h> 2 int main(){ 3 pr

Xamarin.iOS学习一:Hello.iOS 入门学习

介绍使用Xamarin开发iOS 在这两个章节里面,我们会使用Xamarin Studio 或者Visual Studio 创建第一个Xamarin.iOS程序并且去理解使用Xamarin开发iOS程序的基础概念.接着我们将会介绍创建和部署iOS程序所需要的工具.概念和步骤. Hello.iOS 快速入门 首先我们将创建一个让用户输入字母和数字并且可以拨打号码的应用程序,最终效果图如下:

iOS 学习资料整理

视频教程(英文) 视频 简介 Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Application Development 该课程的讲师 Paul Hegarty 是斯坦福大学软件工程学教授, 视频内容讲解得深入, 权威, 深受好评 Advanced iPhone Development - Fall

【资源】IOS学习资料 - 逆天整理 - 精华无密版【最新】【精华】

 入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~  01.IOS基础 01.iOS开发快速入门教程 http://pan.baidu.com/s/1kT3ScOf 链接: http://pan.baidu.com/s/1kTKheAF 密码: yycm 02.苹果开发零基础入门教程 http://pan.baidu.com/s/1dDfHL77 链接: http://pan.baidu.com/s/1o6iNkIu 密码: nn3a 03.黑马IOS2期基础 http:

2015最新iOS学习线路图

iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置的众多技术和功能让 Apple设备始终保持着遥遥领先的地位. iOS学习路线:http://www.mobiletrain.org/page/ios.html 课程分  类 课程模块 模块介绍 课程内容 Part1C语言 C语言和Objective-C语言 C语言 Mac系统及常用工具.进制:C数据

iOS 学习资料

(适合初学者) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Application Development该课程的讲师 Paul Hegarty 是斯坦福大学软件工程学教授, 视频内容讲解得深入, 权威, 深受好评 Advanced iPhone Dev

iOS学习资源收集

https://github.com/Tim9Liu9/TimLiu-iOS 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.com/search 目录 UI 下拉刷新 模糊效果 AutoLayout 富文本 图表 表相关与Tabbar 隐藏与显示 HUD与Toast 对话框 其他UI 动画 侧滑与右滑返回手势 gif动画 其他动画 网络相关 网络连接 图像获取 网络