我正在考虑改变我的格式化风格.我一直这样做:
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)
(*x是const 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++分歧的根源.