【发布时间】:2020-09-23 06:49:51
【问题描述】:
我正在开发一个包含这个库的应用程序,我们称之为 Snap.h。
我发现如果 Snap.h 不是包含语句的最后一个,编译会失败。仔细一看,我发现这段代码在 Snap.h 包含的头文件中
#define Try try {
#define Catch } catch (PExcept Except){ErrNotify(Except->GetMsgStr());}
#define CatchFull } catch (PExcept Except){ErrNotify(Except->GetStr());}
#define CatchAll } catch (...){}
基本上这可以让 try 和 catch 块用作语句,就像这样
Try;
<some code>
Catch;
您可以看到这是一个问题,这些通用宏很容易与其他库发生冲突。
不幸的是,这是数万行非常复杂的代码,而我正在开发的应用程序是围绕这个库构建的。它不容易改变。
Cpp 不是我的强项,有没有办法限制宏在包含中的影响?
【问题讨论】:
-
here a way to limit the effects of macros in an include?#undef? -
将它放在包含列表的最后是第一个选项。您还可以引入另一个标头并将其放在标头的末尾,并使用 #undef 所有这些宏,这样您的代码将受到保护以降低宏的可见性 #include "snap.h"
#include "stap_undef.h"跨度> -
你根本不需要在你自己的代码中使用这种风格,我们希望它总是在
Snap东西中正确和一致地使用。 -
这样的宏技术是恕我直言的反模式(可能会导致您遇到的问题)。在标头中查找此类内容会使代码对我非常可疑。有机会把这些东西扔掉吗?我知道
try和catch在 C++ 程序中做什么,但Try;?Catch;?我以前从未见过这样的事情。有更好的方法来自动化try/catch,例如将其包装在一个函数中,其中内部块(@987654331@ 和catch之间)作为参数提供 - 例如std::function或者更聪明的东西。 -
我认为在包含 Snap.h 的任何时候都包含 #undef 头文件会起作用。 更好的是:编写一个新的头文件
fixedSnap.h和#include<snap.h>和然后是所有必要的#undefs,然后在其余代码中仅使用#include "fixedSnap.h"。 ;-)
标签: c++