UNIX标准化及实现之功能测试宏

在头文件中定义了很多POSIX.1和XSI的符号。但是除了POSIX.1和XSI的定义之外,大多数实现在这些头文件中也加上了它们自己的定义。如果在编译一个程序时,希望它只使用POSIX定义而不使用任何实现自己定义的限制,那么就需要定义常量_POSIX_C_SOURCE。所有POSIX.1头文件中都使用此常量。当定义该常量时,就能排除任何实现专有的定义。

  注:POSIX.1标准的以前版本都定义了_POSIX_SOURCE常量。在POSIX.1的2001版中,它被替换为_POSIX_C_SOURCE。

  常量_POSIX_C_SOURCE及_XOPEN_SOURCE被称为功能测试宏(feature test macro)。所有功能测试宏都以下划线开始。当要使用它们时,通常在cc命令行中以下列方式定义:

  cc -D_POSIX_C_SOURCE=200112 file.c

  这使得C程序包括任何头文件之前,定义了功能测试宏。如果我们仅想使用POSIX.1定义,那么也可将源文件的第一行设置为:

  #define _POSIX_C_SOURCE 200112

  为使Single UNIX Specification v3的功能可由应用程序使用,需将常量_XOPEN_SOURCE定义为600。

  Single UNIX Specification将c99实用程序定义为C编译环境的接口。随之,就可以用如下方式编译文件:

  c99 -D_XOPEN_SOURCE=600 file.c -o file

  为了在gcc C编译器中启用1999 ISO C扩展,可以使用-std = c99选项,如下所示:

  gcc -D_XOPEN_SOURCE=600 -std=c99 file.c -o file

  另一个功能测试宏是:__STDC__,它由符合ISO C标准的C编译器自动定义。这样就允许我们编写ISO C编译器和非ISO C编译器都能编译的程序。例如,为了利用ISO C原型功能(如果支持),一个头文件可能包含:


#ifdef __STDC__

void *myfunc( const char *, int );

#else

void *myfunc();

#endif

  虽然,当今的大多数C编译器都支持ISO C标准,但在很多头文件中仍旧使用__STDC__功能测试宏。

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-22 19:49:23

UNIX标准化及实现之功能测试宏的相关文章

《UNIX环境高级编程(第3版)》——2.7 功能测试宏

2.7 功能测试宏 如前所述,头文件定义了很多POSIX.1和XSI符号.但是除了POSIX.1和XSI定义外,大多数实现在这些头文件中也加入了它们自己的定义.如果在编译一个程序时,希望它只与POSIX的定义相关,而不与任何实现定义的常量冲突,那么就需要定义常量_POSIX_C_SOURCE.一旦定义了_POSIX_C_ SOURCE,所有POSIX.1头文件都使用此常量来排除任何实现专有的定义. POSIX.1标准的早期版本定义了_POSIX_SOURCE常量.在POSIX.1的2001版中,

《UNIX环境高级编程(第3版)》——2.2 UNIX标准化

2.2 UNIX标准化 2.2.1 ISO C 1989年下半年,C程序设计语言的ANSI标准X3.159-1989得到批准.此标准被也采纳为国际标准ISO/IEC 9899:1990.ANSI是美国国家标准学会(American National Standards Institute)的缩写,它是国际标准化组织(International Organization for Standardization,ISO)中代表美国的成员.IEC是国际电子技术委员会(International Ele

《UNIX环境高级编程(第3版)》——导读

前言 当Addison-Wesley公司的编辑找到我说想修订Rich的这本书时,我第一反应是这本书没有多少要改的.尽管13年过去了,Rich的书还是巍然屹立.但是,与当初本书出版的时候相比,今日的UNIX行业已经有了巨大的变化. 系统V的各个变种渐渐被Linux所取代.原来生产硬件配以各自的UNIX版本的几个主要厂商,要么提供了Linux的移植版本,要么宣布支持Linux.Solaris可能算是硕果仅存的占有一定市场份额的UNIX系统V版本4的后裔了. 加州大学伯克利分校的CSRG(计算机科学研

_GUN_SOURCE宏

问题描述:在编译程序时,提示一个错误和一个警告. error:storage size of tz isn't know: 其中tz是struct timezone类型的变量. warning:implicit declaration of function lstat:   使用man手册查了一下,发现tz需要加上sys/time.h头文件,lstat需要加上sys/lstat.h头文件,但这两个头文件都已经包含了,百思不得其解.   无意间搜到一种解决方案,在编译时加上-D_GNU_SOUR

《UNIX环境高级编程(第3版)》——第2章 UNIX标准及实现 2.1引言

第2章 UNIX标准及实现 2.1 引言 人们在UNIX编程环境和C程序设计语言的标准化方面已经做了很多工作.虽然UNIX应用程序在不同的UNIX操作系统版本之间进行移植相当容易,但是20世纪80年代UNIX版本种类的剧增以及它们之间差别的扩大,导致很多大用户(如美国政府)呼吁对其进行标准化. 本章首先回顾过去近25年人们在UNIX标准化方面做出的种种努力,然后讨论这些UNIX编程标准对本书所列举的各种UNIX操作系统实现的影响.所有标准化工作的一个重要部分是对每种实现必须定义的各种限制进行说明

《UNIX网络编程 卷1:套接字联网API(第3版)》——1.10 Unix标准

1.10 Unix标准 在编写本书时,最引人注目的Unix标准化活动是由Austin公共标准修订组(The Austin Common Standards Revision Group,CSRG)主持的.他们的努力结果是涵盖1 700多个编程接口的约4 000页内容的规范[Josey 2002].这些规范既具有IEEE POSIX名字,也具有开放团体的技术标准(The Open Group's Technical Standard)名字.其结果是同一个Unix标准有多个名字来指称:ISO/IEC

裸机编程与OS环境编程的有关思考

这里的所谓的裸机编程指的是为"无OS支持的硬件系统编程",而实际的编程工作肯定需要一个环境,通常这样的情况中,编程和编译的环境叫做"宿主机",最终的程序在"目标机"上运行(交叉编译).而OS环境编程指的是最终运行的程序是在有操作系统支持的环境中运行,而编程和编译的环境,可能是运行程序的机器(本地编译),也可能不是(交叉编译). 裸机编程现在主要是正对低端的嵌入式系统,如SCM(single chip machine).各式MCU.DSP等.当然,

由linux命令行下命令参数前的一横(-)和两横(--)的区别而得知的

在解释这些区别之前我们先了解一下有关linux的背景知识,这个需要大家先认真看完就会对这些区别有更深入的了解,对linux也有更深的了解. 关于System V和BSD风格以及他们与Linux的关系: 1.System V 和BSD同出于AT&T实验室的两个不同的部门,SystemV是一个Unix的商业化标准,BSD为Unix标准化的Berkeley风格. 2.由于Linux是Linus Torvalds在以Unix为构架的系统上重新开发的,但仍沿用了两大Unix系统进程的风格,实事上应该确切的

《Linux/UNIX系统编程手册(上、下册)》——1.3 标准化

1.3 标准化 20世纪80年代末,可用的UNIX实现层出不穷,由此也带来了种种弊端.有些UNIX实现基于BSD,而另一些则基于System V,还有一些则是对两大"流派""兼容并蓄".更有甚者,每个厂商都在自己的UNIX实现中添加了额外特性.其结果是将软件及技术人员在不同UNIX实现间转移就变得异常困难.这一形式有力地推动了C语言和UNIX系统的标准化进程,使得应用程序能够在不同操作系统间很方便地进行移植.接下来,将介绍由此而产生的各种标准. 1.3.1 C编程语