标签 ANSI-C 下的文章

C语言编码风格和标准

近期在为产品线的知识库编写一些指南类的文档,其中有一项就是对现有的C语言编码规范进行一些修订。为了"有米下锅",我还特意在网上找了一些相关资料。关于C语言编码风格和标准的资料大多都成稿于上个世纪90年代,也就是在C90发布之后的若干年里;在C99发布后,部分资料根据最新的规范做了修订,但也有些资料认为C99对整体风格影响不大,也就保持了原样。

 
在这些资料中,我重点关注了一下这份文档《Recommended C Style and Coding Standards》,它是著名的"Indian Hill C Style and Coding Standards"的更新版,从Google的搜索结果来看,似乎影响很广。这份文档内容不多,言简意赅,特别是后面的几个小节,例如宏、条件编译、可移植性以及ANSI C等章节很值得细致阅读和理解。
 
我试图google该文档的中文版,居然没有找到。也许是这个文档比较老了,或者是其中有些注意事项在当今C编程领域较少能遇到了,再或许就是C语言老了,关注的人少了,总而言之,网上没有该文档的中文版。于是乎我就花了一些时间翻译了一个粗糙的中文版,供那些看E文和我一样吃力的朋友们参考。中文版以Wiki的形式放在了Google code(http://code.google.com/p/recommended-c-style-and-coding-standards-cn/)上了。这里需要先说明的是:翻译过程不是很细致,较随意,有些地方我理解得也不慎透彻,欢迎大家提出自己的见解,后续有时间还会持续地修订。
 
这里提供一个快捷入口^_^:
 
12. 常量
13.
15. 调试
19. Lint
20. Make
22. 结论

如果让我面试C程序员,我会问

我有这样的一个习惯,就是看书的时候总是喜欢自问自答,这不周末第二次温习’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。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats