unix网络编程学习笔记2

    看到unix网络编程第七章时,忽然想总结一下C语言的预处理器的有关知识了。

1.预处理器的功能

      在真正开始编译之前C预处理器会对源文件进行预处理,也叫做预编译,主要有三个功能。

      (1)将源文件中以”include”格式包含的文件的内容复制到预编译的源文件中。
      (2)用实际值替换用“#define”定义的符号(即进行宏替换)。
      (3)根据“#if”后面的条件决定需要编译的代码。
以#开头的命令行(#前可以有空格)就是预处理器处理的对象。他们可以出现在任何地方,预处理的过程分为几个阶段:

      首先将三字符序列替换为等价字符,其次将指令行中位于换行符之前的反斜杠删除掉,以把个指令行连接起来,将程序分成用空白符分割的记号(注释将被替换为一个空白符),接着执行预处理指令,并进行宏扩展。之后将转义字符替换成等价的字符,把相邻的字符串字面值连接起来,搜集必要的程序和数据。

2. 行链接

           用反斜杠\进行连接

3. 宏定义和扩展

        宏定义指令:#define  标识符   记号序列

                    #undef  标识符:用于取消标识符的预处理器定义。将其应用于未知标识符(没有用#define定

                                    义的标识符)并不会出错。

        文件包含指令:#include  <文件名>

        条件编译指令:每个条件编译指令都要占一行,条件编译指令有:

               #if  常量表达式       #ifdef   标识符   #ifndef  标识符    #elif  常量表达式   #else

               #ifdef   标识符 等价于 #if  defined  标识符         #ifndef  标识符 等价于 #if   ! defined  标识符

其他的不常用的预处理指令:

#line   #error  #pragma

   #line指令的使用:

        这个宏通常是和__LINE__宏一起使用的,__LINE__宏表示当前c语句在源文件中的行数,以前也只是在书上看到过,写过一些实例小程序,实际应用中并无使用。

   好了,废话不说,举个例子来说明 #line宏的使用:
     1:#include "iostream"
     2:#line 100
     3:using namespace std;
     4:
     5:int main(int argc, char* argv[])
     6:{
     7:cout<<"__LINE__:"<<__LINE__<<endl;
     8:
     9:  return 0;
     10: }
 
      输出结果是:__LINE__:104
 
      本来应该是输出:__LINE__:7,因为“cout<<"__LINE__:"<<__LINE__<<endl;”语句在第7行;
但是有了#line 100 ,则从“#line100”所在行的下一行被认为是第100行,所以输出的行号是104了。

具体例子:

两个头文件的内容:

study.h

#include "study1.h"
char * study(int,int);

study1.h

int study1(int,int);

hong.c

#include "study.h"
/*good good good*/
int study1(int a,int b)
{  return a+b; }

预处理结果:可以看到预处理结果把注释去掉了,而且把两个头文件的内容拷贝了过来。


# 1 "hong.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "hong.c"

# 1 "study.h" 1
# 1 "study1.h" 1
int study1(int,int);
# 2 "study.h" 2
char * study(int,int);
# 3 "hong.c" 2

int study1(int a,int b)
{ return a+b; }




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值