C语言编码风格和标准
近期在为产品线的知识库编写一些指南类的文档,其中有一项就是对现有的C语言编码规范进行一些修订。为了"有米下锅",我还特意在网上找了一些相关资料。关于C语言编码风格和标准的资料大多都成稿于上个世纪90年代,也就是在C90发布之后的若干年里;在C99发布后,部分资料根据最新的规范做了修订,但也有些资料认为C99对整体风格影响不大,也就保持了原样。
一个程序员的心路历程
近期在为产品线的知识库编写一些指南类的文档,其中有一项就是对现有的C语言编码规范进行一些修订。为了"有米下锅",我还特意在网上找了一些相关资料。关于C语言编码风格和标准的资料大多都成稿于上个世纪90年代,也就是在C90发布之后的若干年里;在C99发布后,部分资料根据最新的规范做了修订,但也有些资料认为C99对整体风格影响不大,也就保持了原样。
我有这样的一个习惯,就是看书的时候总是喜欢自问自答,这不周末第二次温习’C专家编程’一书,便有了如下若干问题,明为提问,实则是在提醒自己好好想想这些问题,如果大家有兴趣,也可以给出你自己的答案,如果觉得琢磨不透,可翻看’C专家编程’一书,或多敲几次键盘,自己试上一把!
1、你认为C语言[注1]是一门成功的语言吗?如果认为是,那么你认为它成功的关键在什么地方?或者说它的魅力所在?
2、C语言中的函数是否允许使用复合类型(如结构体类型)作为返回值?
3、C语言中的’一般算术运算’(usual arithmetic conversion)中蕴含着一种称作’值保留(value preserving)’的原则,能详细阐述一下’值保留’的含义吗?
4、如何理解C语言中复杂的类型声明?讲一下你自己最常用的理解这些复杂声明的方法。
5、下面有四组语句:
(1) struct { int x; int y;} p1, p2;
(2) struct point { int x; int y;} p1, p2;
(3) struct point {int x; int y;};
struct point p1, p2;
(4) typedef struct point {int x; int y} point;
point p1, p2;
针对以上这几组语句,回答第4组的第一句的两个’point’有何不同,各自指代什么?(注意:1~3组语句可以作为回答该问题的一个思路的提示)。
6、函数原型(function prototype)和函数签名(function signature)的区别?它们的各自的主要用处在哪?
7、谈谈下面的两组语句是否可行?如果不可行,说明理由!
(1) #define cup int
unsigned cup i;
(2) typedef cup int;
unsigned cup i;
8、指针与数组的不同点(无需说全,谈谈自己的看法即可),举例说明?
9、谈谈在编译链接时,从静态库和动态库提取符号方式有何区别?
10、下面有一段程序:
char g_c[60];
int g_i1;
int g_i2 = 10;
int main() {
int l_i = 89;
return 0;
}
请尝试说明
(1) 变量g_c、g_i1、g_i2以及l_i各自在目标文件a.out中哪些段(section)中?(供选择的段text, data, bss, 某些变量可能不在任何一个段中)
(2) 变量g_c、g_i1、g_i2以及l_i各自在运行进程的地址空间的哪些段(section)中?(供选择的段text, data, bss, heap/stack某些变量可能不在任何一个段中)
11、为下面的函数设计参数类型:
(1) 将char a[5][6]传给函数function1,为使function1的形参能与实参a类型匹配,请给出function1的参数原型;
(2) 将char *b[6]传给函数function2,为使function2的形参能与实参b类型匹配,请给出function2的参数原型;
(3) 将char (*c)[7]传给函数function3,为使function3的形参能与实参c类型匹配,请给出function3的参数原型。
以上问题部分是开放的,如问题1、问题8。能很好的回答上面问题的选手,我想他/她对C语言的理解已经有一定深度了^_^。
[注1]
本文的’C语言’如无特指均为ANSI C。
评论