![]() |
1
22
将扩展到:
然而,如果它是一个函数,那么外部函数(
一个看起来很像函数的宏,但在一个关键的方面表现出不同的行为,在我看来是一个主要的否定 是 宏滥用。 |
![]() |
2
8
这类东西给宏起了一个坏名字,因为它隐藏了一个重要的控制逻辑。 |
![]() |
3
5
我对是否将这种宏称为“滥用”持怀疑态度,但我要说,这不是一个好主意。
不会做你认为会做的事
另外,第二个参数没有使用。这里明显的问题是实现与文档不匹配。隐藏的问题是当宏被这样调用时:
为什么不编写一个函数来封装
只要你所有的电话
我承认很多人害怕
|
![]() |
4
2
这是否是虐待是一个品味的问题。但我看到了一些主要的问题
所以这绝对是非常糟糕的风格。 |
![]() |
5
2
如果宏在一个源文件中,并且只在该文件中使用,那么我发现它比在某个头文件中关闭时要不那么令人讨厌。但我不太喜欢返回的宏(尤其是 终止应用程序,并实际返回),更不用说有条件地返回,因为这样很容易造成以下内存泄漏:
如果我相信文档,我就没有理由怀疑每当读取失败时,这个代码就会泄漏内存。即使文档是正确的,我还是希望C中的控制流非常明显,这意味着不会被宏隐藏。我还希望我的代码在我有资源清理的情况和没有资源清理的情况之间保持模糊的一致性,而不是对其中一个使用宏,而不是对另一个使用宏。所以宏不符合我的口味,即使它不是绝对滥用。
具有
要执行宏实际执行的操作,我更希望完全跳过宏,然后编写:
这并不是一个很长的代码行,而且将它的不同实例共享也没有什么真正的好处。认为通过封装/隐藏现有的、有充分文档记录的方法来改进事情也可能不是一个好主意
控制流的宏
可以
|
![]() |
6
1
我认为这个宏滥用的例子有两个原因:(1)宏的名称没有明确说明它做了什么,最明显的是它可能返回;(2)宏在语法上不等同于一个语句。代码类似 if (someCondition) CHECK_FREAD(whatever); else do_something_else(); 会失败的。我的首选更改: #define LOG_AND_RET_ERROR(msg) do {LOG_ERROR(msg); return DCD_BADREAD;} while(0) if (x==-1) LOG_AND_RET_ERROR(msg); |
![]() |
7
0
好吧,如果你定义了一个短函数,那么你必须在每个调用站点输入更多的字符。即。
与。
|
![]() |
8
0
最让我担心的是,一些新引入的开发人员可能会看到这一点,并考虑这样做
这显然是错误的。
而且,似乎
|
![]() |
Alex Pander · cleaner代码的嵌套命名空间[已关闭] 7 年前 |
![]() |
Jamil Noyda · 导入模块的最佳方式Python[复制] 7 年前 |
![]() |
Samselvaprabu · 我们是否需要不惜任何代价避免重复? 7 年前 |
![]() |
user9549524 · 基于一列的值从二维矩阵中提取值 7 年前 |
![]() |
MedAl · 不使用try/catch处理异常 7 年前 |
![]() |
Declan McKenna · 特殊情况模式在Swift中是否多余? 7 年前 |