编译预处理和混合编程
1. 编译预处理
预处理是指在编译以前所做的工作,他由预处理程序负责完成。当对一个源文件进行编译时,系统将会自动引用预处理程序对源程序中的预处理部分进行处理,处理完成自动进入编译阶段。
2. 定义宏
- 无参宏的定义
无参数宏的宏名后不带参数,定义形式如下:
#define 标识符 字符串
例如:
#include <stdio.h>
#define pi 3.1415926
int main()
{
printf("%lf",pi);
}
宏定义通常写在函数之外,有些编译器支持函数内的宏定义,其作用域为从宏定义命令起到源程序结束。若要终止其作用域,可以使用#undefine
#include <stdio.h>
#define pi 3.1415
void main()
{
}
#undef pi
int sum()
{ //pi在这里将无效
}
- 带参数的宏
定义格式如下:
#define 标识符(形参表) 形参表达式
例如:
#define min(x,y) x>y ? 1:0
- 宏的其他应用
宏定义如果需要换行需要使用""连接。例如
#define SWAP(type,x,y) do{\
type _y=x;\
x=y;\
y=_y;\
} while(0);
int main()
{
int a=10;
int b=20;
SWAP(int,a,b);
printf("%d,%d\n",a,b);
}
运行结果:
china@ubuntu:~/share/define$ gcc swap.c
china@ubuntu:~/share/define$ ./a.out
20,10
3. 文件包含
#include <文件名>
#include “文件名”
//以上两种方式很简单此处省略
4. 条件编译(#ifdef和#ifnde)
形式1:
#ifdef 标识符
程序段1
#else
程序段2
#endif
功能:如果宏定义了标识符,那么对
程序段1进行编译,否则编译程
序段2.假如程序段2没有将可
以写成一下形式:
#ifdef 标识符
程序段
#endif
形式2:
``
#ifndef 标识符
程序段1
#else
程序段2
#endif
功能:如果没有宏定义标识符,那么对程序
段1进行编译,否则编译程序段2.
形式3:
#if 常量表达式
程序块1
#else
程序块2
#endif
功能:常量表达式为真的时候执行程序块1,否则执行程序块2.
5. 混合编程
画重点:
这里所说的是C/C++混合编程,由于历史原因通常C++编译器是具备编译C语言的能力的。为什么这么说勒?在实际情况中一个工程中包含C语言,c++语言,还有其他一些巴拉巴拉的语言,这里仅仅说在C++中要调用C语言实现的内容,说了C++编译器具备编译C语言的能力,那么C++编译器怎么知道什么时候是对C语言编译什么时候是对c++编译勒?
介绍两个特有的 关键表达式(描述可能不规范)
1 extern “C”
2 __cplusplus
#ifndef _C_H_
#define _C_H_
#ifdef __cplusplus
extern "C"
{
#endif
int sum(int a,int b);
int sub(int a,int b);
#ifdef __cplusplus
}
#endif
#endif
功能:当使用C++编译时C++编译器会自动定义一个宏定义
(姑且这么理解吧) __cplusplus,那么C++编译器
就会走到extern “C”即表示后面的是C语言实现的
那么你的采用编译C语言的方式来编译,接着下面
就是需要编译函数的声明,接着了再来一个
#ifdef __cplusplus
}
#endif
将{} 进行配对
假如采用的是C语言编译器的话,那么C语言
编译器是没有办法认识__cplusplus和extern "C"
它两的,因为C语言不会宏定义一个__cplusplus
的宏 所以编译当然不会编译
#ifdef __cplusplus
extern "C"
{
#endif
和
#ifdef __cplusplus
}
#endif
这个两段了,
而C语言编译器执行上面的过程将是一下情况:
#ifndef _C_H_
#define _C_H_
int sum(int a,int b);
int sub(int a,int b);
#endif
所以上面的编译方式既可以实现在C
语言编译器下编译,也能通过C++编
译器进行对C语言的编译,编译通过
后C语言实现的代码是可以在C++文
件中进行调用的