3

C 语言有哪些冷知识?

 3 years ago
source link: https://www.zhihu.com/question/313519801/answer/1705936344
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client
C 语言有哪些冷知识?
登录一下,更多精彩内容等你发现
贡献精彩回答,参与评论互动

multi-character character constant特性。允许这么写,注意是单引号:

int x = 'ABCD';
printf("0x%x\n", x); // 0x41424344

在C语言中单引号字符默认为int类型,而在C++默认为char类型。单引号字符必须非空。

这个我在禁止RTTI的项目中见过,给接口定义ID,通过ID进行dynamic_cast/query_interface,而又不想在定义时显式使用魔鬼数字。

struct Interface {
    enum { ID = 'INTF' };
};
继续浏览内容
v2-88158afcff1e7f4b8b00a1ba81171b61_720w.png
发现更大的世界
v2-a448b133c0201b59631ccfa93cb650f3_1440w.png
Chrome
百度 高级研发工程师
继续浏览内容
v2-88158afcff1e7f4b8b00a1ba81171b61_720w.png
发现更大的世界
v2-a448b133c0201b59631ccfa93cb650f3_1440w.png
Chrome
C++话题下的优秀答主

C++98 的 union 就和 C89 的不同了。有些一直合法的 C 写法(用 union 进行类型双关)在标准 C++ 中一直是 UB 。不过不少 C++ 编译器默认会迁就 C 兼容性,允许这种写法。

C 可以用宏配合 _Generic 做一些类似重载的设计。 _Generic 表达式通过类型在编译时选择各个表达式之一。

其用法是 _Generic(SelectingExpr, T1 : E1, T2 : E2, ..., default: EDefault) , default 分支可选。

SeletingExpr 不求值,只取其类型。每一个 Tn 必须是互不兼容(近似于互不相同)的类型,如果 SeletingExpr 的类型和每个 Tn 都不匹配且无 default ,则无法通过编译。整个 _Generic 表达式的类型和值类别同匹配的 Tn 的 En 或 EDefault 。

_Generic 可以把 <tgmath.h> 里的宏实现全部标准化。不过因为 <tgmath.h>早于 _Generic ,所以一般看到的实现都用了编译器扩展。

C 有专门的 float _Imaginary/double _Imaginary/long double _Imaginary 类型表示虚部,不过这个特性是可选的。 C99 可以仅支持 _Complex 而不支持 _Imaginary ,而 C11 要求是复数类型可选,但若支持复数类型则必须支持虚数类型。

虚数类型和对应的实浮点类型的大小、对齐、对象表示相同(分别表示 [公式][公式] 时)。但它们不能相互别名使用 (aliasing) 。

近年来 C++ 的标准库常有弃用和移除的内容。但 C 标准库只弃用并移除过一个函数,即 gets 。(另外最近的 C17 弃用了 ATOM_VAR_INIT 这个宏,原因是它没有用)

继续浏览内容
v2-88158afcff1e7f4b8b00a1ba81171b61_720w.png
发现更大的世界
v2-a448b133c0201b59631ccfa93cb650f3_1440w.png
Chrome

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK