|
知识路径: > 嵌入式系统软件基础知识 > 嵌入式系统程序设计 > 嵌入式程序设计语言 > 嵌入式C/C++程序设计要求 > C程序设计基础 > C程序基础 >
|
被考次数:6次
被考频率:中频率
总体答错率:50%  
知识难度系数:
|
由 软考在线 用户真实做题大数据统计生成
|
考试要求:掌握
相关知识点:28个
|
|
|
|
在C程序中以#开头的行被称为预处理指令,这些指令是ANSI C统一规定的。编程时可使用预处理命令来扩展C语言的表示能力,提高编程效率。对C源程序进行编译之前,首先由预处理器对程序中的预处理指令进行处理。
|
|
|
文件包含#include、宏定义#define、条件编译#ifdef、#ifndef是常用的预处理命令,在头文件assert.h中定义宏assert(断言),用于测试表达式的值,若表达式的值为0,则显示错误信息并终止程序的运行。
|
|
|
|
在C程序中用好宏定义可以提高程序的可移植性、可读性,减少出错。对于嵌入式系统而言,为了达到性能要求,也常用宏作为一种代替函数的方法。例如,用宏求解两个数据对象的较小者。
|
|
|
|
再如,用#define声明一个常数,忽略闰年情况下表示一年有多少秒。
|
|
|
|
通过使用预定义宏可以返回程序的某些状态,以方便交叉编译和调试,每个预定义宏的名称一两个下画线字符开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。例如,用_FUNC_打印函数名、_LINE_打印行号,以定位程序中打印该信息的函数和位置。常用的几个预定义宏如下。
|
|
|
_DATE_当前源文件的编译日期,格式为“Mmm dd yyyy”的字符串字面量
|
|
|
_TIME_当前源文件的编译时间,格式为“hh:mm:ss”的字符串字面量
|
|
|
|
|
_LINE_当前程序行的行号,表示为十进制整型常量
|
|
|
_STDC_若当前编译器符合ISO标准,那么该宏的值为1,否则未定义
|
|
|
_STDC_HOSTED_(C99)如果当前是宿主系统,则该宏的值为1,否则为0
|
|
|
|
编写嵌入式应用程序时经常会遇到一种情况,当满足某条件时对一组语句进行编译,而当条件不满足时则编译另一组语句,这时就需要使用条件编译。条件编译命令最常见的形式为:
|
|
|
|
其作用是:当标识符已经被定义过(一般是用#define命令定义),则对程序段1进行编译,否则编译程序段2,其中#else部分也可以没有。
|
|
|
在所有的预处理指令中,#pragma最为复杂,其作用是设定编译器的状态或者是指示编译器完成一些特定的动作,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。#pragma pack有多种形式,#pragma pack(n)表示变量以n字节对齐。
|
|
|
在网络程序中采用#pragma pack(1)(即变量紧缩),可以减少网络流量以及兼容各种系统,避免由于系统对齐方式不同而导致的解包错误。
|
|
|