C语言快速讲解(七)预编译

前言:作为一个安卓程序员,如果不懂C/C++开发,那么安卓jni、NDK、视频解码、音频解码也没法开发,有需求我们就要学习,加油吧!今天开始我们快速讲解C语言,有Java基础的人适合看本博客。

-----------分割线---------

我们先来了解一下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)联接起来,从而形成一个新的子串。或者理解为##是将宏定义的多个形参连接成一个实际的参数名。

# 符号:连接符是把传递过来的参数当成字符串进行替代。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。 

---------完---------

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值