关闭

C语言预编译

标签: C语言预编译命令条件编译
194人阅读 评论(0) 收藏 举报
分类:

一、宏定义:

不带参的宏定义

#define  宏名  宏体

在该语句以下的内容,宏名将被宏体所替换。

#define  HELLO  “hello world!\n”

int main(void)

{

      printf(HELLO);

      return 0;

}

打印的结果是:hello world!

因为printf中的HELLO 被”hello world!\n”所替换。

不带参数的宏定义的4个特点:

1 若宏名出现在某个字符串中,则宏名不被宏体所替换,如:

#define HELLO  “hello world!\n”

Int main(void)

{

      printf(“HELLO\n”);

      return 0;

}

打印结果是:HELLO

2 若宏体需要换行,可以在本行末尾使用反斜杠“\”表示续行。

3 若宏被定义在函数外部,则其作用域从被定义处开始到文件末尾。

4 可以使用#undef结束宏的作用域。

带参数的宏定义:

#define   宏名(参数列表) 宏体

与函数的使用相似,给宏名实参后,实参将替换宏体中相应的形参。

例如:

#define  ADD(a,b)  ((a)+(b))

Int main(void)

{

      printf(“3+4 = %d\n”, ADD(3,4));

      return 0;

}

打印结果是:3+4 = 7

带参数的宏定义的注意事项:

1 给宏体中的每个形参带上括号,防止出错:

#define  ADD(a,b)  a*b

Int main(void)

{

      printf(“3 * (3+4) = %d\n”,ADD(3 , 3+4));

      return 0;

}

打印的结果是:3 * (3+4) = 13

因为宏展开后是:3*3+4;而不是想要的3*(3+4)。

2 给宏体也带上括号,原因如上。

3 宏名和参数列表之间不能有空格。

二、include

作用包含另一个文件。

<>和””的区别:

使用<>包含文件,编译器会先到c库函数头文件所在目录查找被包含的文件。

使用””包含文件,编译器会先到用户当前目录下查找被包含的文件。

三、条件编译

#if  表达式

……

#else

…….

#endif

若#if后面的表达式为真,则编译#if至#else之间的代码;若为假,则编译#else至#endif之间的代码;

#include<stdio.h>

#definei  70

intmain(void)

{

#if i> 50

printf("i> 50");

#else

#if i ==50

printf("i ==50");

#else

printf("i< 50");

#endif

#endif

return 0;

}

打印结果是: i > 50

1 #if 和if语句的区别在于if语句无论if后面的表达式是真是假,if后面的代码和else后面的代码都会被编译;而#if在表达式真的时候只编译#if到#else之间的代码,假的时候只编译#else到#endif之间的代码。

2 #if必须有#endif与他搭配,而且#endif总是和他最近的没有#endif搭配的#if搭配。

3 #if后面的表达式不能有局部变量,条件编译是在编译时期做判断的,编译时期局部变量没有值。

4 #if后面的表达式可以包含全局变量,但要注意全局变量在编译时期值为0,是故有:

#include<stdio.h>

int a =70;                //定义全局变量

intmain(void)

{

#if a ==0

printf("a ==0");       //此处被打印

printf(“,a = %d\n”,a);

#else

#if a == 70

printf(a == 70");

#else

printf("a !=70 && a != 0\n");

#endif

#endif

return 0;

}

打印结果是: a == 0, a = 70

#ifdef  宏名

…….

#endif

若宏名已经被定义,则编译#ifdef到#endif之间的代码

#ifndef  宏名

……..

#endif

若宏名没有被定义,则编译#ifndef到#endif之间的代码



0
0
查看评论

C语言 预编译 详解

转载自:http://www.cnblogs.com/rusty/archive/2011/03/27/1996806.html   显示有问题,有必要的话请转向原始链接 一、C语言由源代码生成的各阶段如下: <!-- p {margin-bottom:0.21c...
  • qiantuo1234
  • qiantuo1234
  • 2011-11-16 10:59
  • 3398

C语言之预编译指令

宏在C中预编译指令是很重要的一个部分,所以必须要把它掌握:
  • u012741741
  • u012741741
  • 2016-06-19 23:08
  • 668

C语言中的三大预编译功能

这三种预处理包括:宏定义、文件包含、条件编译。 宏定义是C语言提供的三种预处理功能的其中一种。宏定义和操作符的区别是:宏定义是替换,不做计算,也不做表达式求解。 宏定义又称为宏代换、宏替换,简称“宏”。 格式: #define 标识符 字符串 其...
  • u011146511
  • u011146511
  • 2017-04-07 16:53
  • 364

C语言中的预编译宏定义

在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理.  C初学者可能对预处理器没什么概念, 这是情有可原的...
  • chinaeran
  • chinaeran
  • 2015-01-14 16:25
  • 4654

c语言预编译

   C中的预处理命令是由ANSIC统一规定的,但它不是C语言的本身组成部分,不能直接对它们进行编译,因为编译程序无法识别它们。必须对程序进行通常的编译(包括词法和语法分析,代码生成,优化等)之前,先对程序中这...
  • vincentxu
  • vincentxu
  • 2007-11-02 19:35
  • 3585

聊聊C语言的预编译指令include

“include”相信大家不会陌生,在我们写代码时,开头总会来一句“include XXX”。include是干嘛用的,很多教材都提到了,因此这里不会再详细解释了,大概意思就是将代码文件需要用到的函数声明、常量等包含到代码文件中。include不是C语言的关键字,而是属于一种预编译的指令,那么预编译...
  • kelehaier
  • kelehaier
  • 2016-12-29 15:34
  • 547

C语言各种预编译宏总结

查看gcc所定义的宏的命令:cpp -dM /dev/null 命令一: cpp -dM /dev/null 命令二: gcc -dM -E - 1:OS MACRO:   WINDOWS: _WIN32、WIN32、_WIN64;   UNIX: unix、__unix、__...
  • u012842205
  • u012842205
  • 2015-07-20 21:35
  • 1302

sizeof 操作符可以用于#if 预编译指令中吗?

sizeof 操作符可以用于#if 预编译指令中吗? 不行。预编译在编译过程的早期进行,  此时尚未对类型名称进行分析。 作为替代, 可以考虑使用ANSI 的 中定义的常量, 或者使用“配置”(configure) 脚本。更好的办法是, 书写与类型大小无关的代码
  • Augusdi
  • Augusdi
  • 2014-06-06 15:48
  • 1637

c语言编译预处理和条件编译执行过程的理解

在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令。预处理命令属于C语言编译器,而不是C语言的组成部分。通过预处理命令可扩展C语言程序设计的环境。 一.预处理的工作方式   1.1.预处理的功能     在集成开发环境中,编译,链接是同时完成的。其...
  • liaoshengshi
  • liaoshengshi
  • 2015-11-12 00:24
  • 1108

利用C语言的预编译隐藏函数定义

利用宏定义隐藏函数声明:主要是针对预编译中 "##" 的使用 问题背景: 想要实现类似面向对象语言中关于多态的能力,例如:取两个数字的较大者 分析问题: 数值类比较一般是整数和浮点数,因此一般实现无非声明两类函数进行实现 解决问题: 利用宏定义中的字符串替换,减少重复...
  • yjbqzsf
  • yjbqzsf
  • 2015-05-22 14:35
  • 338
    个人资料
    • 访问:4330次
    • 积分:114
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论