情况是statement1 + statement2:编码不良
Is case statement1 + statement2: poor coding?
我写了一个switch语句,看起来像这样:
switch(statement){
case statement1:
break;
case statement2:
break;
case statement3:
break;
case statement4:
break;
case statement1 + statement2:
break;
case statement1 + statement3:
break;
case statement1 + statement4:
break;
default:
break;
}
与头文件中定义的语句:#define statement1 999
#define statement2 32898
#define statement3 32899
#define statement4 32900
对我来说,这是提供更多的语句,而不需要定义更多的变量。允许我有不同的选项,这取决于在以前的代码中选择了什么语句。
社区如何看待这段代码?接受了吗?糟糕的实践?可避免的?
我能看到的唯一的风险是,如果有一个定义33897,33898,33899。
嗯,虽然我不喜欢开关,但我认为你的代码可以改进很多。
首先,在交换机中使用操作符并没有错。您可以使用任何类型的constexpr来表示您想要的东西。对整数的操作是constexpr.
我想修改的是:
const int statement1 = 999;
const int statement2 = 32898;
const int statement3 = 32899;
const int statement4 = 32900;
如果c++11可用,我将使用constexpr
。
宏可以隐藏一些可疑的东西,比如函数调用和复杂的操作。现在它们是整型,可以在编译时使用。
此外,常量很难阅读,特别是那些名称-。您可以在编译时使用constexpr函数生成这些常量的值,或者简单地给它们起一个更好的名字,并可能进行注释。
在switch语句中添加整数在实践中并不坏,但正如您所说,我能看到的唯一风险是是否存在定义33897,33898,33899。这就是为什么你应该给这些操作的结果赋予意义。如果33897确实是您想要测试的值,那么这样做:
const int combine2 = statement1 + statement2;
const int combine3 = statement1 + statement3;
如果你不想让它们出现在全局作用域中,你可以在你的函数中定义它们。
尽量避免使用#define。是的,这是一个不好的做法。
你可以用constexpr:
constexpr int statement1 = 2;
,你可以做完全相同的事情。但是你得到了更多的表达性和类型安全性。
- 如何确定我已使用非编码文件到达 EOF?
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 在卡萨布兰卡形成编码参数的列表
- 使用C++进行游程编码
- 如何将不同的可执行文件合并到一个窗口框架中进行编码?像浏览器一样
- 使用已使用 java 编码的 openssl 解码数据
- boost 是否有按特殊类型值编码状态"compact optional"?
- 如何在CPP的给定目录中列出UTF编码的文件名?
- 如何使用 C++将 ISO-2022-KR 编码转换为 UTF-8 编码?
- 绝对编码器十六进制输入
- 防止C++中的硬编码数字
- 为什么"using System;"不被视为不良做法?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 使用文件内容作为硬编码字符串
- 运行长度编码程序 c++ 的问题
- 以C++为单位进行运行长度编码
- *新的编码器*格式和运算符
- wxthread文档示例有用或不良的编码实践
- 不良的编码实践?条件中的预递增 &&
- 情况是statement1 + statement2:编码不良