首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >cpp库中包含的宏正在破坏代码库的其余部分。

cpp库中包含的宏正在破坏代码库的其余部分。
EN

Stack Overflow用户
提问于 2020-09-23 14:49:52
回答 1查看 50关注 0票数 0

我正在开发一个包含此库的应用程序,我们将其命名为Snap.h。

我发现如果Snap.h不是包含语句的最后一个,编译就会失败。仔细看,我在Snap.h包含的头文件中找到了以下代码

代码语言:javascript
复制
#define Try try {
#define Catch } catch (PExcept Except){ErrNotify(Except->GetMsgStr());}
#define CatchFull } catch (PExcept Except){ErrNotify(Except->GetStr());}
#define CatchAll } catch (...){}

基本上,这让我们尝试并捕获要用作语句的块,如下所示

代码语言:javascript
复制
Try;
<some code>
Catch;

你可以看到这是一个问题,这些泛型宏很容易与其他库发生冲突。

不幸的是,这是数万行非常复杂的代码,而我正在开发的应用程序就是围绕这个库构建的。它不容易改变。

Cpp不是我的强项,有没有办法在include中限制宏的效果?

EN

回答 1

Stack Overflow用户

发布于 2020-09-23 16:38:24

我不是#undef的狂热粉丝,因为你永远不会知道还有什么不好的东西可以在那个大标题中沉睡。我更喜欢将其隔离在“编译屏障”中,即仅将其包含在单独的包装器转换单元中,该单元仅重新定义和转发您需要的内容。在下面的示例中,Snap.hBULLSHIT重新定义为std::terminate,但是正如您可以尝试的那样,main.cpp可以在没有其BULLSHIT版本的情况下使用Snap.h中的函数

代码语言:javascript
复制
/*! @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();
        }

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64022489

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档