一点 C 的小题目

来源:互联网 发布:联通怎么开副卡软件 编辑:程序博客网 时间:2024/06/02 02:38
关于接口设计的。
: 如果是我面试,可能会出这样的题目,哈哈。

: 1.
: char* strchr(const char* str, int c);
: 函数返回 str 中第一次出现 c 的位置,传入的是不可修改的 const char*,
: 为何返回的却是可修改的 char* ?

因为要考虑实参是 char* 和 const char* 两种情况。
char* 做参数调用的时候,往往是希望对结果位置的字符能进行修改的。
char* 转为 const char* 不需要显式地类型转换,反之则需要.
const char* 出现在参数的位置, 也能够兼容 char*; 而作为返回值得时候,则是 char*
能够赋值给 const char*,作为折衷,strchr 就选择了这个原型.类似的函数还有
strstr strrchr strpbrk 等.

不过这会带来类型安全上的小漏洞。

在 C++ 中,有更好地解决办法:
C++ 提供了两个 strchr
char* strchr(char* str, int c);
const char* strchr(const char* str, int c)


: 2.
: 有些头文件中这样声明常量:
: enum XXX
: {
:         AAA,
: #define AAA AAA
:         BBB,
: #define BBB BBB
: };

: 为什么用枚举声明常量后还要用宏在声明一次?

这样的代码常用于系统头文件中.比如 socket 支持的 ioctl 码的种类.
写成枚举是因为不用人为去维护这些常量的值,而用宏再定义一次则是为了能让代码
在编译期间检测系统是否支持该特性. 
原创粉丝点击