- UID
- 1029342
- 性别
- 男
|
11、指定的初始化符
C99中,该特性对经常使用稀疏数组的程序员十分有用。指定的初始化符通常有两种用法:用于数组,
以及用于结构和联合。用于数组的格式:[index] = vol; 其中,index表示数组的下标,vol表示本数组
元素的初始化值。
例如: int x[10] = {[0] = 10, [5] = 30}; 其中只有x[0]和x[5]得到了初始化.用于结构或联
合的格式如下:
member-name(成员名称)
对结构进行指定的初始化时,允许采用简单的方法对结构中的指定成员进行初始化。
例如: struct example{ int k, m, n; } object = {m = 10,n = 200};
其中,没有初始化k。对结构成员进行初始化的顺序没有限制。
12、printf()和scanf()函数系列的增强
C99中printf()和scanf()函数系列引进了处理long long int和unsigned long long int数据类型
的特性。long long int 类型的格式修饰符是ll。在printf()和scanf()函数中,ll适用于d, i, o, u 和x
格式说明符。另外,C99还引进了hh修饰符。当使用d, i, o, u和x格式说明符时,hh用于指定char
型变元。ll和hh修饰符均可以用于n说明符。
格式修饰符a和A用在printf()函数中时,结果将会输出十六进制的浮点数。格式如下:[-]0xh, hhhhp
+ d 使用A格式修饰符时,x和p必须是大写。A和a格式修饰符也可以用在scanf()函数中,用于读取
浮点数。调用printf()函数时,允许在%f说明符前加上l修饰符,即%lf,但不起作用。
13、C99新增的库
C89中标准的头文件
<assert.h> 定义宏assert()
<ctype.h> 字符处理
<errno.h> 错误报告
<float.h> 定义与实现相关的浮点值勤
<limits.h> 定义与实现相关的各种极限值
<locale.h> 支持函数setlocale()
<math.h> 数学函数库使用的各种定义
<setjmp.h> 支持非局部跳转
<signal.h> 定义信号值
<stdarg.h> 支持可变长度的变元列表
<stddef.h> 定义常用常数
<stdio.h> 支持文件输入和输出
<stdlib.h> 其他各种声明
<string.h> 支持串函数
<time.h> 支持系统时间函数
C99新增的头文件和库
<complex.h> 支持复数算法
<fenv.h> 给出对浮点状态标记和浮点环境的其他方面的访问
<inttypes.h> 定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数
<iso646.h> 首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏
<stdbool.h> 支持布尔数据类型类型。定义宏bool,以便兼容于C++
<stdint.h> 定义标准的、可移植的整型类型集合。该文件包含在<inttypes.h>中
<tgmath.h> 定义一般类型的浮点宏
<wchar.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节函数
<wctype.h> 首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数
14、__func__预定义标识符
用于指出__func__所存放的函数名,类似于字符串赋值。 15、其它特性的改动
放宽的转换限制
限制 C89标准 C99标准
数据块的嵌套层数 15 127
条件语句的嵌套层数 8 63
内部标识符中的有效字符个数 31 63
外部标识符中的有效字符个数 6 31
结构或联合中的成员个数 127 1023
函数调用中的参数个数 31 127
不再支持隐含式的int规则
删除了隐含式函数声明
对返回值的约束
C99中,非空类型函数必须使用带返回值的return语句.
扩展的整数类型
扩展类型 含义
int16_t 整数长度为精确16位
int_least16_t 整数长度为至少16位
int_fast32_t 最稳固的整数类型,其长度为至少32位
intmax_t 最大整数类型
uintmax_t 最大无符号整数类型
对整数类型提升规则的改进
C89中,表达式中类型为char,short int或int的值可以提升为int或unsigned int类型.
C99中,每种整数类型都有一个级别.例如:long long int 的级别高于int, int的级别高于char
等.在表达式中,其级别低于int或unsigned int的任何整数类型均可被替换成int或unsigned int类型.
下面是从其他地方转载的内容(http://wenwen.soso.com/z/q271522221.htm):
AMD x86 Open64 Compiler Suite | Mostly | Has C99 support equal to that of GCC.[1] | Ch | Partial | Supports major C99 features.[2] | Clang | Mostly | Does not support C99 floating-point pragmas.[3] | GCC | Mostly | As of January 2011[update] and GCC 4.5, 12 features suffer library issues, 1 feature is broken and 6 are missing. 43 C99 features have been completely implemented, however many features still remain unimplemented.[4] | Intel C++ compiler | Mostly | long double is not supported. | Open Watcom | Partial | Implements the most-used parts of the standard. However, they are enabled only through an undocumented command-line switch.[5] | Pelles C | Mostly | Supports most C99 features. | Portable C compiler | Partial | Working towards becoming C99-compliant. | Sun Studio | Full[6] |
| Tiny C Compiler | Mostly | Does not support complex numbers or variable length arrays.[7] The developers state that "TCC is heading toward full ISOC99 compliance".[8] | IBM C for AIX, V6 [9] and XL C/C++ V11.1 for AIX[10] | ? | IBM Rational logiscope | Full | Until Logiscope 6.3, only basic constructs of C99 were supported. C99 is officially supported in Logiscope 6.4 and later versions.[11] | Microsoft Visual Studio | No | As of Visual Studio 2010, there are no plans to support C99.[12][13] |
看上面的支持列表,完全支持C99的只有Sun Studio和IBM Rational logiscope,
VC直到2010都没有计划支持C99。
http://www.cnblogs.com/emituofo/archive/2012/07/21/2601930.html:
VC++支持ANSI C毋庸置疑,不过对于是否支持C99,我倒看到两种说法:
1. 不支持C99.
2. 支持C99的个别特性.
到底是神马情况? 我试验了VC++ 2010,可以确定VC++ 2010支持C99下面的几个特性:
- 支持 // 开头的单行注释
- 支持 long long等数据类型,但是printf、scanf的格式化串不支持long long类型
- 支持可变参数宏
VC++ 2010不支持C99下面的几个特性:
- 支持不定长的数组
- 变量声明不必放在语句块的开头
- 除了已有的 __line__、__file__ 以外,增加了 __func__ 得到当前的函数名。
结论就是VC++ 2010对C99的支持少得可怜的。
ps: VC++ 2010虽然用不了,但是可以用__FUNCTION__。但是__FUNCTION__和__func__性质是不一样的。前者是VC++编译器指定的,后者是C99标准指定的。 |
|