C++ 正在处理宏重新定义而不修改.h文件。。。C/C++;语言

C++ 正在处理宏重新定义而不修改.h文件。。。C/C++;语言,c++,c,C++,C,背景: 假设我有两个头文件a.h和b.h a、 h包括: #define VAR 1 #define VAR 2 b、 h包括: #define VAR 1 #define VAR 2 注意:两个宏的名称相同。 假设我有一些文件myFile.c,其中包括两个头文件,即a.h和b.h 当我试图访问VAR时,我得到了VAR的重新定义错误 为了解决这个问题,我在a.h和b.h文件中都插入了#ifndef VAR语句来防止这个错误。 a、 h文件变为 #ifndef VAR #define

背景:

假设我有两个头文件a.h和b.h

a、 h包括:

#define VAR 1
#define VAR 2
b、 h包括:

#define VAR 1
#define VAR 2
注意:两个宏的名称相同。 假设我有一些文件myFile.c,其中包括两个头文件,即a.h和b.h

当我试图访问VAR时,我得到了VAR的重新定义错误

为了解决这个问题,我在a.h和b.h文件中都插入了#ifndef VAR语句来防止这个错误。 a、 h文件变为

#ifndef VAR
  #define VAR 1
#endif
#ifndef VAR
  #define VAR 2
#endif
b、 h文件变为

#ifndef VAR
  #define VAR 1
#endif
#ifndef VAR
  #define VAR 2
#endif
注意:头文件可以包含多个宏,而不仅仅是一个宏

问题:

假设a.h和b.h文件是从第三方库中获取的。这些文件不包含#ifndef VAR语句

我不允许更改它们的头文件

我能否解决使用VAR宏的myFile.c或myFile.cpp文件中的宏“VAR”重新定义错误

我知道可以使用I#undef VAR来取消定义宏变量。如何在以后的程序中有选择地包括VAR?i、 e.在myFile.c代码的第10行,我应该能够参考a.h文件中的VAR定义,在代码的第15行,我应该能够参考b.h文件中的VAR,在第18行,我应该能够参考a.h文件中的VAR

简而言之,我能做宏多态性吗? 给定头文件的名称,它应该引用该文件中的宏定义

我想到了使用名称空间技巧来解决一个问题。定义命名空间第一中的第一个头文件和命名空间第二中的第二个头文件

我尝试定义两个名称空间。第一个命名空间包含#include a.h,第二个命名空间包含b.h。但是,命名空间技巧不适用于宏。当我试图访问firstns::VAR时,编译器报告了一条错误消息


您可以提出一些建议吗?

您可以始终通过自己的专用头文件包含有问题的头文件,您可以在其中添加必要的
\ifdef
\unde
等宏以防止重新定义错误。例如

wrapperToA.h
-----
#ifdef VAR
  #undef VAR
#endif

#include "a.h"

更新:@Vlad在此期间制定了完整的解决方案-对他(和+1:-)的赞扬

宏扩展发生在级别上,不受名称空间使用的影响

是否所有宏都要使用简单常量,而不是在etc中使用

如果是这样,那么您可以尝试以下方法来弥补预处理器/编译器之间的差距,并保留对
A
B
VAR等定义的访问权限(如果适合您的情况):

// ab_wrapper.h
#include <a.h>
static const int   A_VAR1 = VAR1;
static const char* A_VAR2 = VAR2;
#undef VAR1
#undef VAR2

#include <b.h>
static const int   B_VAR1 = VAR1;
static const char* B_VAR2 = VAR2;

// code.c
#include <ab_wrapper.h>
...
int x = A_VAR1;
int y = B_VAR1;
...
//ab_wrapper.h
#包括
静态常数int A_VAR1=VAR1;
静态常量char*A_VAR2=VAR2;
#未定义变量1
#未定义变量2
#包括
静态常数int B_VAR1=VAR1;
静态常量char*B_VAR2=VAR2;
//代码c
#包括
...
int x=A_VAR1;
int y=B_VAR1;
...

扩展Peter Torok的答案

包装第三方组件通常是一个好主意

有多个步骤:

  • 在您自己的头中包装头,这允许控制选项(例如定义一些预处理标记或基于您自己的标记取消定义其他标记)
  • 创建一个轻量级facade库,注意隐藏潜在的危险方法,必要时用互斥体包装它们等等。。。否则,只需隐藏细节,这样任何更改都不会波及到所有代码库
你对第一句话更感兴趣,这也是最常见的。把它们包起来:

// wrapper/a.h
#ifdef VAR
#undef VAR
#endif // ifdef VAR

#include <3rdparty/a.h>
这肯定更复杂:)您还需要使用
unde
来包装“aa.h”,以避免出现问题


当然,这意味着您最好不要在代码中的任何地方依赖
VAR
,因为您知道它的定义可能会根据您包含标题的顺序而改变…

这并不能回答OPs需要互换使用
A
B
VAR
定义。它适用于定义常数如何处理计算某些值的宏?我们可以为这些宏编写内联函数,然后取消这些宏的定义吗?