绝密笔记 | 基础知识 | 每日一练(102)

基础知识练习

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

学生:#pragma 是什么, 有什么用?

小林:#pragam 指令提供了一种单一的明确定义的 “救生舱”, 可以用作各种 (不可移植的) 实现相关的控制和扩展: 源码表控制、结构压缩、警告去除 (就像 lint 的老 /* NOTREACHED */ 注释), 等等。

学生:“#pragma once” 是什么意思?我在一些头文件中看到了它。

小林:这是某些预处理器实现的扩展用于使头文件自我识别; 它跟问题 10.5 中讲到的 #ifndef 技巧等价, 不过移植性差些。

学生:a[3] = “abc”; 合法吗?它是什么意思?

小林:尽管只在极其有限的环境下有用, 可它在 ANSI C 中是合法的。它声明了一个长度为 3 的数组, 把它的三个字符初始化为’a’, ’b’ 和 ’c’, 但却没有通常的 ’\0’ 字符。因此该数组并不是一个真正的 C 字符串从而不能用在 strcpy, printf %s 等当中。多数时候, 你应该让编译器计算数组初始化的初始值个数, 在初始值 “abc” 中,计算得长度当然应该是 4。

学生:为什么我不能对 void* 指针进行运算?

小林:编译器不知道所指对象的大小。在作运算之前, 把指针转化为 char * 或你准备操作的其它指针类型。

正文完