我正在开发一个包含此库的应用程序,我们将其命名为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;
<some code>
Catch;你可以看到这是一个问题,这些泛型宏很容易与其他库发生冲突。
不幸的是,这是数万行非常复杂的代码,而我正在开发的应用程序就是围绕这个库构建的。它不容易改变。
Cpp不是我的强项,有没有办法在include中限制宏的效果?
发布于 2020-09-23 16:38:24
我不是#undef的狂热粉丝,因为你永远不会知道还有什么不好的东西可以在那个大标题中沉睡。我更喜欢将其隔离在“编译屏障”中,即仅将其包含在单独的包装器转换单元中,该单元仅重新定义和转发您需要的内容。在下面的示例中,Snap.h将BULLSHIT重新定义为std::terminate,但是正如您可以尝试的那样,main.cpp可以在没有其BULLSHIT版本的情况下使用Snap.h中的函数
/*! @file main.cpp
*/
#include <iostream>
#define BULLSHIT
#include "snap_wrapper.h"
int main() {
BULLSHIT
std::cout << wrapper::nice_function() << "\n";
}
/*! @file Snap.h
*/
#ifndef UNTITLED5_SNAP_H
#define UNTITLED5_SNAP_H
#define BULLSHIT std::terminate();
int nice_function() {
return 42;
}
#endif //UNTITLED5_SNAP_H
/*! @snap_wrapper.h
*/
#ifndef UNTITLED5_SNAP_WRAPPER_H
#define UNTITLED5_SNAP_WRAPPER_H
namespace wrapper{
int nice_function();
}
#endif //UNTITLED5_SNAP_WRAPPER_H
/*! @file snap_wrapper.c
*/
#include "snap_wrapper.h"
#include "Snap.h"
namespace wrapper {
int nice_function() {
return ::nice_function();
}
}https://stackoverflow.com/questions/64022489
复制相似问题