前言:
目前你们对“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语言定时执行