C定义格式化问题

mah*_*udz 1 c c++ objective-c

我正在考虑改变我的格式化风格.我一直这样做:

char *foo(IULabel *label, char *buffer) {
    UITextView  *tv;
    int         i;
    int         *j;

...
}
Run Code Online (Sandbox Code Playgroud)

而且我在想,如果我写的话可能会更容易理解:

char * foo(IULabel * label, char * buffer) {
    UITextView *    tv;
    int             i;
    int *           j;

...
}
Run Code Online (Sandbox Code Playgroud)

要么

char* foo(IULabel* label, char* buffer) {
    UITextView*    tv;
    int             i;
    int*            j;

...
}
Run Code Online (Sandbox Code Playgroud)

你怎么做呢?

caf*_*caf 13

我用的风格:

char *x;
Run Code Online (Sandbox Code Playgroud)

因为这在逻辑上反映了C解析声明的方式 - "定义遵循使用"规则.不要以为" x是一个char *",认为" *x是一个char".

这使您可以正确解析这些定义:

const char *x;
Run Code Online (Sandbox Code Playgroud)

(*xconst char)

char * const x;
Run Code Online (Sandbox Code Playgroud)

(x,常数,申请后*是一个字符)

char *x, y, **z;
Run Code Online (Sandbox Code Playgroud)

(*x是一个char,y是一个char,**z是一个字符)

附录:

回应几条评论......

TYPE LABEL;即使您在一行上禁止多个声明(我也不同意,int i, j;也一直是惯用的C),声明可以写成最终为更复杂的类型分解的想法.例如,如果我想声明x为"10个字符数组的指针",那么类型是char (*)[10](例如,这就是你在演员表中编写它的方式).但你不能使用这种TYPE LABEL;模式:

char (*)[10] x;    /* Not valid C :( */
Run Code Online (Sandbox Code Playgroud)

函数指针是另一个例子.在这一点上通常的反驳是"总是使用一个typedef像这样的复杂类型!",在这里我觉得我们必须简单地分道扬and并同意不同意.你要么考虑逻辑上的不一致和限制("每行只声明一个变量","总是从简单的typedef中构建复杂的类型"),要使声明看起来像你认为的那样,或者你不应该付出适当的代价. .

为了回应Stroustrup的评论,我注意到K&R使用了这种char *x风格,在这里看起来我们在这个风格问题上有C/C++分歧的根源.