重读《c primer plus》发现了99%的人都会忽略的知识点之ANSI/ISO C标准_编译器

1.你需要知道什么是ANSI/ISO C标准


ANSI C是由(ANSI)及(ISO)推出的关于C语言的标准。ANSI C 主要标准化了现存的实现, 同时增加了一些来自 C++ 的内容 (主要是函数原型) 并支持多国字符集 (包括备受争议的三字符序列)。 ANSI C 标准同时规定了 C 运行期库例程的标准。


 2.ANSI 编译器在遇到代码警告类型不匹配的情况

extern int func(float); int func(x) float x;

不匹配的原因:


旧的 C 编译器 (包括未使用原型和变长参数列表的 ANSI C) 会 ``放宽" 传入 函数的某些参数。 浮点数被升为双精度浮点数, 字符和段整型被升为整型。 对于旧式的函数定义, 参数值会在被调函数的内部自动转换为对应的较窄 的类型。


 怎么写可以避免警告呢?


  • 使用新型的语法一致性:

int func(float x) { ... }

  • 把新型原型声明改成跟旧式定义一致。

extern int func(double);


 3.关键字const

const 关键字含义是 ``只读的"; 用它限定的对象是运行时 (同常)  不能被赋值的对象。因此用 const 限定的对象的值并 不完全是一个真正的常量。

为什么要用const


“它限定一个变量不允许被改变,产生静态作用。使用const在一定程度上可以提高程序的安全性和可靠性。另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一定帮助。”

——引自百度百科



 const的主要作用:


  1. 不可变性。
  2. 便于进行类型检查,方便编译器处理,消除隐患。
  3. 避免意义模糊的数字出现,同样可以很方便地进行参数的调整和修改。 同宏定义一样,可以做到不变则已,一变都变!
  4. 保护被修饰的东西,防止意外的修改,增强程序的健壮性。 
  5.  节省空间,避免不必要的内存分配。


 未完待续