编译预处理和混合编程

编译预处理和混合编程

1. 编译预处理
预处理是指在编译以前所做的工作,他由预处理程序负责完成。当对一个源文件进行编译时,系统将会自动引用预处理程序对源程序中的预处理部分进行处理,处理完成自动进入编译阶段。
2. 定义宏

  1. 无参宏的定义
    无参数宏的宏名后不带参数,定义形式如下:
#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在这里将无效
}
  1. 带参数的宏
    定义格式如下:
 #define  标识符(形参表) 形参表达式

例如:

#define  min(x,y)  x>y ? 1:0
  1. 宏的其他应用
    宏定义如果需要换行需要使用""连接。例如

#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++文
件中进行调用的
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值