技巧和窍门–使用编译器内部函数编写可移植代码

并非所有预处理器指令均创建为相等。根据使用的是GNU C,IAR嵌入式工作台,Keil uVision还是任何其他编译器,开发人员将具有不同的预处理器指令。 ANSI-C具有有限数量的预处理器指令,该指令包含在标准中,可以视为可移植的。

编译器供应商可以添加不属于标准的预处理器指令。例如,#warning是C90或C99不支持的常用预处理器指令! #error预处理程序指令是标准的一部分,并且#warning由编译器供应商添加,以允许开发人员提出编译警告。严重依赖#warning的开发人员可能会将代码移植到无法将#warning视为有效的预处理程序指令的编译器,或者可能会将其视为具有不同目的!

对编写可移植代码感兴趣的开发人员需要注意嵌入式软件中使用了哪些预处理程序指令。最明显的非便携式预处理器指令是#pragma,通常可将其视为在应用程序中声明实现定义的行为。在应移植到其他工具链的应用程序中,应尽可能避免使用#pragma。

始终不能避免使用#pragma或其他专门的预处理程序指令。其中可能需要#pragma的一个示例是指定应对代码区域执行的优化。处于类似情况的开发人员可以使用编译器预定义的宏和条件编译来确保代码得到优化,并且如果将代码移植到另一个编译器中,则会在编译时引发错误。每个编译器都有自己的一组预定义宏,包括可以用于标识正在使用的编译器的宏。图1显示了一些编译器定义的宏的示例,这些宏可能是开发人员感兴趣的。

本征1图1 –编译器定义的宏

 图1中标识编译器的预定义宏可以用作预处理器指令的一部分,以有条件地编译代码。然后,可以使用手头任务所需的不可移植的预处理程序指令将可以使用的每个编译器添加到条件语句中。图2显示了开发人员如何利用预定义的编译器宏有条件地将虚构的#pragma语句编译为代码库。

本征2 图2 –对非便携式结构使用条件编译

 对编写可移植的ANSI-C代码感兴趣的开发人员应查阅ANSI-C标准,例如C90,C99或C11,并检查附录中实现定义的行为。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.