甜咸之争
经常写C++的基本上避不开使用指针,而且C++中指针类型的写法大体上有两种:
int* a = nullptr; //*靠前
int *b = nullptr; //*靠后
都是声明一个指针。
关于哪种写法的倾向性,每个人都不太一样,有的往前放,有的往后放,还有的👴爱放哪放哪,你管得着嘛。
《C++ Primer》中推荐靠后,原因是:
int *a,b,c; // a是指针,b和c都不是
int* a,b,c; // 一样,但容易引起误会,让人误以为b和c是指针,实则不然
不过用Visual Studio写C++的时候,格式化方式又有所不同,当你敲完int*a=nullptr;
后会靠前,会变成int* a=nullptr;
,其原因可能是隔壁的C#只允许往前放的写法:
//C#代码
unsafe ...
{
int* a,b,c; // a,b,c都是指针
int *a,*b,*c; // 错误!不让这么写。
}
我倒是不关心C#怎么写,但是在C++的语境下,我赞同《C++ Primer》的观点,喜欢往后放,但是VS就像个傲娇一样,分号一敲完就把我刚写好的int *a
变成了int* a
。
难道甜和咸就不共戴天了么??
当然不是,对于C++代码,VS默认状态下使用的是Clang-Format方案。
Clang-Format将这个问题称为指针对齐,使用PointerAlignment
设置,其实听说Clang默认是Right
的。不过在Clang-Format配置文件中VS默认将PointerAlignment
置为Left
。
当然,我们倒没必要把VS的Clang-Format配置文件拎出来暴打一顿塞回去,VS其实允许我们手动设置这个风格,步骤如下:
菜单栏→工具→选项
,打开选项窗口- 左侧搜索“格式”然后找到箭头所指的项(或者在左侧直接按树找
文本编辑器→C/C++
) - 依次往下找,
代码样式→格式设置→间距
,然后在右侧找运算符的间距→指针/引用对齐方式
下面有四个选项,你就可以设置成你prefer的方式,然后在下面看预览效果观察*
和&
的位置,确定就好了
这样,VS就不会执拗地把*
往前放了。
类似地,关于其他运算符的设置方法也可以在这个上下文中进行,因此这个位置值得记录一下,毕竟恰当设置可以提升开发效率,这个设置的位置又比较隐蔽容易迷路,所以特此记录一下。