丑陋的宏观解释(仅1行)

use*_*466 1 c

#define STRING(s) (((String*)s)-1)
Run Code Online (Sandbox Code Playgroud)

世界上到底是 (((String*)s)-1)什么?

typedef 
struct String {
    int length;
    int capacity;
    unsigned check;
    char ptr[0];
} String;
Run Code Online (Sandbox Code Playgroud)

Ano*_*on. 8

你铸造sString *.然后你从中减去一个(使它指向以前的任何东西).

更具体的东西需要知道String- 但是(WILD SPECULATION)的定义我猜应用程序使用双VB/C风格的字符串(空终止,前面有长度),这个函数从适合C的形式改变它函数(指向第一个字符的指针)成为可用于另一个类型的指针(指向长度的指针).

  • +1即将编写类似的东西,它也是pascal程序编码字符串的常用格式. (2认同)

Dal*_*und 5

在机械方面,宏可以像其他人已经描述的那样工作.但是,从语义上讲,你可以将其视为从char *s到String *s 的一种铸造形式.

String结构是一个计数字符串的首部,即,一个在那里你知道的总长度,而无需扫描一个NUL字节.此特定版本还保留已分配的总数.你可以创建一个如下:

struct String *str = malloc(sizeof(*s) + maxlen);
str->length = 0;
str->capacity = maxlen;
str->checked = /* ??? */;
Run Code Online (Sandbox Code Playgroud)

在某处可以有一些各种各样的功能来操纵这些计数的字符串.

宏本身是一个黑客,从平原char *,假设指向String上面分配的a的第一个字符,回到a String *.它将使用这样的东西:

/* allocate str as above */
char *s = str->p;
Run Code Online (Sandbox Code Playgroud)

现在,通过一系列函数调用或返回,你以某种方式松散跟踪包含的String结构s,你需要再次找到它.你写:

String *str2 = STRING(s);
Run Code Online (Sandbox Code Playgroud)

这不是在C中实现计数字符串的特别好的方法,但它演示了一种人们不时看到的技术.