C语言快速讲解(七)预编译
2017-06-29 22:18
183 查看
前言:作为一个安卓程序员,如果不懂C/C++开发,那么安卓jni、NDK、视频解码、音频解码也没法开发,有需求我们就要学习,加油吧!今天开始我们快速讲解C语言,有Java基础的人适合看本博客。
-----------分割线---------
我们先来了解一下C语言执行的大致流程:编译->连接->执行。
编译:形成目标代码(.obj);
连接:将目标代码与C函数库连接合并,形成最终的可执行文件;
执行:执行exe文件;
-------------分割线-------
include:完成代码文本的替换工作。
首先在头文件新建一个hello.txt文件。
内容是:
然后在源文件中引入这个hello.txt,完成代码文本的替换工作:
--------分割线-------
include定义函数声明并实现:
在头文件新建一个myhead.h文件,在里面声明一个函数:
--------分割线--------
include循环嵌套:何谓是循环嵌套,简单理解就是我们在A里面引入B的东西,然后又在B里面引入A的东西,然后我们在主程序中,只需要引入一个A就可以使用A和B的函数,有点类似于java中的继承。
ok我们新建一个A.h在头文件中:
当然你在最新的编译器中B.h也可以这样写(A.h同样):
然后在源文件02.c中实现A.h和B.h的两个函数:
------------分割线-----------------
define替换:
------------分割线---------
ifdef:上面A.h和B.h中提到了ifdef翻译起来就是如果....没有...。来看具体案例:
在01.c中添加如下代码:
ok注释掉此代码然后在源文件中新建03.cpp,添加如下代码:
--------分割线-------
宏函数1:
宏函数2:
## 连接符: 功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。或者理解为##是将宏定义的多个形参连接成一个实际的参数名。
# 符号:连接符是把传递过来的参数当成字符串进行替代。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
---------完---------
-----------分割线---------
我们先来了解一下C语言执行的大致流程:编译->连接->执行。
编译:形成目标代码(.obj);
连接:将目标代码与C函数库连接合并,形成最终的可执行文件;
执行:执行exe文件;
-------------分割线-------
include:完成代码文本的替换工作。
首先在头文件新建一个hello.txt文件。
内容是:
然后在源文件中引入这个hello.txt,完成代码文本的替换工作:
#include <stdlib.h> #include <stdio.h> void main(){ #include "hello.txt" getchar(); }运行显示:
--------分割线-------
include定义函数声明并实现:
在头文件新建一个myhead.h文件,在里面声明一个函数:
void say();//声明函数然后在源文件里面新建一个02.c在里面实现具体的函数内容
void say(){ printf("hello"); }然后在源文件01.c中引入myhead.h文件,然后在main中调用say函数:
#include <stdlib.h> #include <stdio.h> #include "myhead.h"//我们定义头文件 void main(){ say(); getchar(); }运行显示:
--------分割线--------
include循环嵌套:何谓是循环嵌套,简单理解就是我们在A里面引入B的东西,然后又在B里面引入A的东西,然后我们在主程序中,只需要引入一个A就可以使用A和B的函数,有点类似于java中的继承。
ok我们新建一个A.h在头文件中:
#ifndef AH #define AH #include "B.h" void printfA(); #endif然后在新建一个B.h在头文件中:
#ifndef BH #define BH #include "A.h" void printfB(); #endif
当然你在最新的编译器中B.h也可以这样写(A.h同样):
#pragma once #include "A.h" void printfB();
然后在源文件02.c中实现A.h和B.h的两个函数:
void printfA(){ printf("print A\n"); } void printfB(){ printf("print B\n"); }最后在源文件01.c中引入A.h,在main中调用两个函数:
#include <stdlib.h> #include <stdio.h> #include "A.h" void main(){ printfA(); printfB(); getchar(); }运行显示:
------------分割线-----------------
define替换:
#include <stdlib.h> #include <stdio.h> #define MAX 1000 void main(){ int a = MAX; printf("%d\n",a); getchar(); }运行显示:
------------分割线---------
ifdef:上面A.h和B.h中提到了ifdef翻译起来就是如果....没有...。来看具体案例:
在01.c中添加如下代码:
#include <stdio.h> void main(){ #ifdef __cplusplus printf("当前是c++语言"); #else printf("当前是c语言"); #endif getchar(); }运行:
ok注释掉此代码然后在源文件中新建03.cpp,添加如下代码:
#include <stdio.h> void main(){ #ifdef __cplusplus printf("当前是c++语言"); #else printf("当前是c语言"); #endif getchar(); }运行显示:
--------分割线-------
宏函数1:
//宏函数 void fly_c_add(){ printf("add\n"); } void fly_c_div(){ printf("div\n"); } //NAME是参数 #define fun(NAME) fly_c_##NAME(); void main(){ //fly_c_add(10,20); fun(add); getchar(); }运行:
宏函数2:
void foo(char *str) { printf("%s\n", str); } void foo2(char *str1, char *str2) { printf("%s, %s\n", str1, str2); } #define call_optimized(function, arguments) {\ printf("%s\n", #function); \ function arguments; \ } void main() { call_optimized(foo, ("hell world")); //call_optimized(foo2, ("hell", "world")); system("pause"); }运行:
## 连接符: 功能是在带参数的宏定义中将两个子串(token)联接起来,从而形成一个新的子串。或者理解为##是将宏定义的多个形参连接成一个实际的参数名。
# 符号:连接符是把传递过来的参数当成字符串进行替代。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。
---------完---------
相关文章推荐
- C语言快速讲解(五)结构体与指针
- C语言快速讲解(六)联合体、枚举、IO
- C语言快速讲解(四)字符串的相关操作
- C语言快速讲解(三)动态内存分配
- C语言快速讲解(一)
- C语言快速讲解(二)指针的用法
- 详细讲解C语言单机小游戏——打字母游戏
- 基础快速过 之C语言 三:函数之快速运用~~[函数的用法,参数概念,自己写的函数,变量和常量的用法]
- 快速排序思想及C语言代码
- 快速排序 C语言的qsort及C++的sort
- 快速求素数 C语言
- C语言中实现KMP算法的实例讲解
- 排序 (插入排序,快速排序,希尔排序)数据结构与算法分析-C语言描述
- 黑马程序员 - C语言 -手动管理内存快速入门
- c语言 三子棋/井字棋 算法源代码并讲解
- C语言 冒泡排序 快速排序 直接插入排序 选择排序
- 51nod 1113 (矩阵快速幂讲解)
- C语言快速入门之运算符
- C语言实现快速排序
- C语言基本功教程系列 快速的函数调用