我最近被一个微妙的bug咬了.
char ** int2str = {
"zero", // 0
"one", // 1
"two" // 2
"three",// 3
nullptr };
assert( int2str[1] == std::string("one") ); // passes
assert( int2str[2] == std::string("two") ); // fails
Run Code Online (Sandbox Code Playgroud)
如果你有神圣的代码审查权力,你会注意到我忘记了,后"two".
经过相当大的努力找到这个bug我必须问为什么有人会想要这种行为?
我可以看到这对宏魔术有什么用处,但是为什么这是像python这样的现代语言中的"特征"?
您是否曾在生产代码中使用字符串文字串联?
我注意到你可以做到这一点。
来自https://clang.llvm.org/docs/ClangFormatStyleOptions.html#
BCIS_BeforeComma(在配置中:BeforeComma)在冒号和逗号之前中断构造函数初始值设定项,并将逗号与冒号对齐。
得到以下效果
Constructor()
: initializer1()
, initializer2()
Run Code Online (Sandbox Code Playgroud)
我想同样能够打破
foo(a,b,c,d,e)
Run Code Online (Sandbox Code Playgroud)
到
foo
( a
, b
, c
, d
, e
);
Run Code Online (Sandbox Code Playgroud)
这可能吗?
C/C++的resharper 格式化程序似乎有这样一个选项。Prefer wrap before ","在页面上搜索。
我最近修复了一个类似的结果的错误
const char *arr[] = {
"string1", //some comment
"string2",
"string3" //another comment
"string4",
"string5"
};
Run Code Online (Sandbox Code Playgroud)
即有人忘记了一个,在"string3"之后,"string3"和"string4"被粘贴在一起.现在,虽然这是完全合法的代码,是否有gcc警告标志,或其他工具可以扫描代码库中的类似错误?