#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)
你铸造s的String *.然后你从中减去一个(使它指向以前的任何东西).
更具体的东西需要知道String- 但是(WILD SPECULATION)的定义我猜应用程序使用双VB/C风格的字符串(空终止,前面有长度),这个函数从适合C的形式改变它函数(指向第一个字符的指针)成为可用于另一个类型的指针(指向长度的指针).
在机械方面,宏可以像其他人已经描述的那样工作.但是,从语义上讲,你可以将其视为从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中实现计数字符串的特别好的方法,但它演示了一种人们不时看到的技术.