C++ 包含的cpp库上的宏正在破坏代码库的其余部分

C++ 包含的cpp库上的宏正在破坏代码库的其余部分,c++,C++,我正在开发一个包含这个库的应用程序,让我们调用Snap.h 我发现如果Snap.h不是includes语句的最后一个,编译就会失败。仔细看,我在Snap.h包含的头文件中找到了这段代码 #define Try try { #define Catch } catch (PExcept Except){ErrNotify(Except->GetMsgStr());} #define CatchFull } catch (PExcept Except){ErrNotify(Except->

我正在开发一个包含这个库的应用程序,让我们调用Snap.h

我发现如果Snap.h不是includes语句的最后一个,编译就会失败。仔细看,我在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中宏的效果?

我不太喜欢
#undef
的东西,因为你现在再也不知道还有什么不好的东西可以睡在这个大标题中了。我更喜欢将它隔离在一个“编译屏障”中,也就是说,只将它包含在一个单独的包装器翻译单元中,这只会重新定义和转发您需要的内容。在以下示例中,
Snap.h
BULLSHIT
重新定义为
std::terminate
,但您可以尝试,
main.cpp
可以使用
Snap.h
中的函数,而不使用其版本的
BULLSHIT

/*! @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();
        }

}
/*@文件main.cpp
*/
#包括
#胡说八道
#包括“snap_wrapper.h”
int main(){
瞎扯

std::cout
这里有一种方法可以限制include中宏的效果?
取消定义
?将其放在include列表的最后是第一个选项。您还可以引入另一个标题,并将其放在标题的末尾,同时“取消所有这些宏的定义”,这样您的代码将受到保护以降低宏的可见性#include“snap.h”
#包括“stap_undef.h”您不需要在自己的代码中使用这种样式,希望它在
Snap
内容中始终正确一致地使用。这种宏技术是反模式的(可能会导致您遇到的问题)在头上找到这样的东西会让代码非常可疑。有没有机会把这些东西扔掉?我知道什么是<代码> > <代码> catch <代码> >在C++程序中,但是<代码>尝试;< /COD> >代码> catch;< /代码>?我以前从未见过这样的事情。有更好的方法来自动<代码>尝试/ catch <代码>,例如在FUNC中包装它。内部块的位置(介于
try
catch
之间)作为参数提供-例如,使用
std::function
或更聪明的东西。我认为在包含Snap.h的任何时候包含一个#undef头文件都会起作用。更好的是:编写一个新的头文件
fixedSnap.h
,它包含
,然后包含所有必要的
#undef
,然后只使用
#include>“fixedSnap.h”
位于代码的其余部分中。;-)