一点 C 的小题目

关于接口设计的。
: 如果是我面试,可能会出这样的题目,哈哈。

: 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 码的种类.
写成枚举是因为不用人为去维护这些常量的值,而用宏再定义一次则是为了能让代码
在编译期间检测系统是否支持该特性. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值