菜单
首页/博客/奇淫巧技 in C

奇淫巧技 in C

其实只是一些语法糖,并不是奇淫巧技。但不能因为重心放在研究语法技巧,而遗忘真正的事情。

C99 复合字面量

void foo(int data[4]);

void bar(){
    foo((int[4]){1000,
                 2000,
                 1000,
                 0});
}
  1. 复合,指可用于数组、结构体。结构体可以指定成员(参考下面)

  2. C99 特性。不过现在环境都支持 C99 吧

  3. 本质是创建匿名变量,其实可以用类似int *a=(int[4]{1, 2, 3, 4}来当变量使,但是及其不建议,当临时变量用就行

  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};
    

    但结构体可以变量互相赋值,但数组不行。

  5. 一般用于创建字面量

C语言复合字面量应该如何使用? - 知乎

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
    }
}
  1. 用 .成员名 (结构体)或[index](数组)指定赋值
  2. 可不按顺序
  3. 未赋值,自动赋值 0 / 空值
  4. 仅能初始化,运行中不能这样

字符串字面量拼接

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");
  1. 仅用于字面量字符串,也就是常量(const 不行)才可以,变量不行
  2. 很老的特性,古代就可以用了,但是似乎平常用的很少
  3. C99 之前就可以用,但是 C99 才允许普通字符串 + 宽字符串(如 "abc" L"def")