奇淫巧技 in C
其实只是一些语法糖,并不是奇淫巧技。但不能因为重心放在研究语法技巧,而遗忘真正的事情。
C99 复合字面量
void foo(int data[4]);
void bar(){
foo((int[4]){1000,
2000,
1000,
0});
}
复合,指可用于数组、结构体。结构体可以指定成员(参考下面)
C99 特性。不过现在环境都支持 C99 吧
本质是创建匿名变量,其实可以用类似
int *a=(int[4]{1, 2, 3, 4}来当变量使,但是及其不建议,当临时变量用就行下面这种写法是不行的:
int a[4]; a=(int[4]{1, 2, 3, 4};但结构体可以
typedef struct {int a; int b} foo_t; foo_t foo; foo = {1, 2};但结构体可以变量互相赋值,但数组不行。
一般用于创建字面量
C99:指定初始化器(Designated Initializers)
struct foo{
int a;
float b;
char c;
};
void bar(){
struct foo x = {
.a = 114,
.b = 51.4f,
.c = 'f'
};
int y[4] = {
[0] = 0,
[1] = 7,
[2] = 2,
[3] = 1
}
}
- 用
.成员名(结构体)或[index](数组)指定赋值 - 可不按顺序
- 未赋值,自动赋值 0 / 空值
- 仅能初始化,运行中不能这样
字符串字面量拼接
char *s = "aaa""bbb"; // "aaabbb"
// ======== usage ========
#define VERSION "v1.2.0"
#define DEVICE "STM32H723"
foo("version: " VERSION ", device: " DEVICE);
// 相当于 foo("version: v1.2.0, device: STM32H723");
- 仅用于字面量字符串,也就是常量(const 不行)才可以,变量不行
- 很老的特性,古代就可以用了,但是似乎平常用的很少
- C99 之前就可以用,但是 C99 才允许普通字符串 + 宽字符串(如
"abc" L"def")