6

我正在使用一个 3rd 方开源应用程序,它做了一些我认为很奇怪的事情。我想听听您对您是否认为这是错误的/邪恶的/可憎的/等等,或者是否有正当理由这样做的意见。

简单地说,他们使用#include pre-proc 指令来包含包含代码片段的“头文件”。不是函数的原型。不是内联函数。只是部分代码。

这是一个简单的例子。首先是 main.cpp 文件:

#include <iostream>
//Other "normal" includes here...

int main(int argc, char *argv[]) {

  cout << "Initializing program..." << endl;
  #include "parseArgs.h"

  // ... remainder of the program

  cout << "Exiting." << endl;
  return 0;
}

在 parseArgs.h 头文件中,有一个小代码片段。请注意,这正是 parseArgs.h 文件中的内容。这不是函数的一部分。没有包含守卫,只有以下 4 行:

argList args(argc, argv);
if(!args.valid()) {
  cout << "Invalid arguments.";
  exit(1);
}

在实际程序中,有几个这样的#include 指令,每个指令都执行另一个小任务。

这似乎是危险和疯狂的。我不知道他们为什么不把这些写成函数。

你的想法和意见?

4

5 回答 5

9

我想你在这里谈论的是OpenFOAM。这些代码片段解决的问题是避免重复 OpenFOAM 中的许多应用程序需要的样板代码。将这段代码放在函数中并不能解决问题,因为在函数中声明的变量在其范围内是局部的。也许可以想出一个包含这些变量作为成员的基类方案。但这只会增加另一层间接性,并不能真正解决任何问题。你仍然依赖于变量名(或者,如果你想让它干净,getter-names)。

就个人而言,我不确定这种做法是好是坏。它就是这样,它是 OpenFOAM 代码文化的一部分(或本地术语,如果你愿意的话)。乍一看,这令人惊讶,但很快就习惯了。

但是,除非您自己开发 OpenFOAM 应用程序/扩展,否则我强烈反对这种做法。OpenFOAM 有点独特,因为它包含几乎数百个可执行文件,所有这些都需要一些重叠的样板代码,否则很难维护。如果你不是那种情况,那就不要这样做。

于 2013-03-11T11:11:30.060 回答
0

我会犹豫称其为“疯狂”,因为这种#include用法可能是有原因的。问题是要了解这些原因并判断这是否是给定上下文中的最佳方法。我可以想象的原因,代码是以某种方式生成的,而不是手写的。

OTOH 它确实看起来很奇怪,并且确实有一定的代码气味。我也很想知道究竟是什么原因,如果事实证明没有原因或原因错误,那么它是重构的一个很好的候选者。

于 2013-03-11T10:44:31.293 回答
0

我认为这很混乱,而且你会更好地编写一个函数。

这是我在 SO 上发现的一个问题,询问“为什么在 C++ 中包含两次头文件是有效的?” 你可能会觉得答案很有趣,我永远不会这样写我的代码,因为我认为修复错误和任何其他问题会很痛苦而且很耗时

于 2013-03-11T10:58:42.657 回答
0

我不会把这种事情称为“疯狂”——我会使用“不寻常”、“难以理解”、“出乎意料”等术语,因此“难以阅读、调试和维护”。或者只是“WTF”——降低代码质量

永远不要那样做。使用函数。或者,如果它真的,真的必须是,使用一个完全相同但人们更熟悉的宏。是的,宏很糟糕,在调试时可能会变成皮塔饼。但这更糟。

编辑:澄清:我不喜欢宏。我尽可能避免使用它们。大多。使用函数,模板,任何东西。但是当它归结为“宏或WTF- #include”时,请使用宏。

于 2013-03-11T11:06:27.643 回答
0

如果您在团队中工作,则需要建立程序和标准以确保沟通顺畅。一旦解决了这个问题,你说的是葡萄牙语还是普通话都没有关系,只要每个人都能接受。

这是一个心态问题。有些人——包括与我一起工作的老师——被规则所奴役;但是,我不能认真对待它们,特别是当其中一个为了教 OO 使用“生菜”和“水果”作为示例时。我怀疑科尔伯格的阶段有一点点减缓了某些人的思维。

我在个人项目中使用这种技术 - 包括 source.cpp。我已经在 C 和 Lazarus (Pascal) 中完成了它,它比摆弄链接器参数和 makefile 更符合我的目的。我的代码有注释,变量声明是对齐的,赋值运算符也是对齐的,当学生给我代码时,我会在所有代码中插入空格和行,直到它看起来像我喜欢的方式,然后再分析它。我痴迷于干净的源代码组织。你看?疯子有办法!

工具(#include、#define、lambda...)就是:工具,但当然,意外使用工具可能会让人迷失方向;那很糟糕。更重要的是,当“软件的心理复杂性”(谷歌搜索)伤害到(你或你团队中的某个人)时,立即停下来,找出问题所在。

那是我的2cts。

于 2020-12-30T16:01:50.543 回答