龙空技术网

C语言预处理器

一代盐商 979

前言:

目前你们对“c语言定时执行”大致比较珍视,咱们都想要分析一些“c语言定时执行”的相关内容。那么小编在网络上网罗了一些有关“c语言定时执行””的相关知识,希望姐妹们能喜欢,兄弟们快快来了解一下吧!

预处理(或称预编译)是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理指令指示在程序正式编译前就由编译器进行的操作,可放在程序中任何位置

预处理是C语言的一个重要功能,它由预处理程序负责完成。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译

C语言提供多种预处理功能,主要处理#开始的预编译指令,如宏定义(#define)、文件包含(#include)、条件编译(#ifdef)等。合理使用预处理功能编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计

宏定义

C语言源程序中允许用一个标识符来表示一个替换体,称为"宏"。宏的标识符称为"宏名"。在编译预处理时,对程序中所有出现的宏名,都用宏定义中的替换体去替换,这过程称为宏替换宏展开

宏定义#define命令完成的;宏替换由预处理程序自动完成的。

在C语言中,宏定义分有参数和无参数两种。

无参宏定义

语法:

#define 宏名 替换体

解释:

以#开头的均为预处理命令define为宏定义命令宏名一般用大写字母表示,以便于与变量区别替换体可以是常数、表达式、格式串宏定义末尾不必加分号,否则连分号一并替换宏定义不分配内存,变量定义分配内存可用#undef命令终止宏定义的作用域宏定义用宏名来表示一个替换体,在宏展开时又以该替换体取代宏名。这只是一种简单的文本替换,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现

示例:

#define PI 3.14
#define Z (y*y+3*y)

带参宏定义

C语言允许宏带有参数。在宏定义中的参数称为形式参数,在宏调用中的参数称为实际参数对带参数的宏,在调用中,不仅要宏展开,而且要用实参去代换形参

语法:

#define 宏名(形参表) 替换体

解释:

宏名和形参表的括号间不能有空格宏替换只作替换,不做计算,不做表达式求解函数调用在编译后程序运行时进行,并且分配内存。宏替换在编译前进行,不分配内存宏定义时替换体建议所有的层次都要加括号

示例:

#define MAX(x,y) (((x) > (y)) ? (x) : (y))

预定义宏

ANSI C定义了许多可在C语言程序中使用的预定义的宏。如下表所示

说明

_DATE_

MMM DD YYYY格式表示当前日期

_TIME_

HH:MM:SS格式表示当前时间

_FILE_

表示当前文件名

_LINE_

表示当前行

_STDC_

当编译器符合ANSI标准时,它被定义为1

文件包含

语法:

#include <filename>
#include "filename"

解释:

文件包含命令把指定头文件插入该命令行位置取代该命令行,从而把指定的文件和当前的源程序文件连成一个源文件。在程序设计中,文件包含是很有用的。一个大程序可以分为多个模块,由多个程序员分别编程。有些公用的符号常量或宏定义等可单独组成一个文件,在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头都去书写那些公用量,从而节省时间,并减少出错。一个include命令只能指定一个被包含文件,若有多个文件要包含,则需用多个include命令。文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。#include <filename>告诉编译器查找保存系统头文件的目录。在UNIX中,它是\usr\include目录#include "filename"指示编译器查看运行程序的当前目录。

示例:

#include <stdio.h>int main() {    printf("Hello C");    return 0;}
#undef

#undef预处理指令用于取消通过#define定义的常量或宏。

语法:

#undef 宏名

解释:

将移除上面的宏定义,然后可以重新定义新宏。如果想使用一个名称,又不确定之前是否已经用过,可以用#undef指令取消该名称的定义

示例:

条件编译

#ifdef预处理程序指令检查宏是否由#define定义。 如果是,则执行代码,否则#else代码执行(如果存在)。

语法:

#ifdef 宏名     // 程序段  #endif

解释:

如果宏名已被#define定义过,则对程序段进行编译,否则不编译。

#else语法:

#ifdef 宏名      // 程序段1  #else      // 程序段2 #endif

解释:

如果宏名已被#define定义过,则对程序段1进行编译,否则编译程序段2

语法:

#ifndef 宏名    // 程序段#endif

解释:

如果宏名未被#define定义过,则对程序段进行编译,否则不编译。

语法:

#ifndef 宏名      // 程序段1  #else      // 程序段2 #endif

解释:

如果宏名未被#define定义过,则对程序段1进行编译,否则编译程序段2

语法:

#if 常量表达式    // 程序段#endif

解释:

常量表达式的值为真(非0),则对程序段进行编译,否则不编译。

语法:

#if 常量表达式      // 程序段1  #else      // 程序段2 #endif

解释:

常量表达式的值为真(非0),则对程序段1进行编译,否则编译程序段2

#error

#error预处理程序指令用于指示错误。如果找到#error指令编译器将发出致命错误,并且跳过进一步的编译过程。

语法:

#error error-message

示例:

#include <stdio.h>#define PI 3.14#ifndef PI#error not define PI#elseint main() {    printf("PI = %f\n", PI);    return 0;}#endif

解释:

#define PI 3.14这行代码注释掉的话,将发出致命错误,并且跳过进一步的编译过程。

pragma

#pragma 用于指示编译器完成一些特定的动作

#pragma 所定义的很多指示字是编译器特有的

#pragma 在不同的编译器间是不可移植的

预处理器将忽略它不认识的 #pragma 指令不同的编译器可能以不同的方式解释同一条 #pragma 指令

语法:

#pragma parameter

示例:

#pragma once

解释:

#pragma once 用于保证头文件只被编译一次#pragma once 是编译器相关的,不一定被支持

标签: #c语言定时执行