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

use*_*119 6 c c++

背景:

假设我有两个头文件啊和bh

啊包含:

#define VAR 1
Run Code Online (Sandbox Code Playgroud)

bh包含:

#define VAR 2
Run Code Online (Sandbox Code Playgroud)

注意:两个宏的名称相同.假设我有一些文件myFile.c,其中包括两个头文件ieah和bh

当我尝试访问VAR时,我得到VAR的重定义错误.

为了解决这个问题,我在ah和bh文件中插入了#ifndef VAR语句以防止出现此错误.啊文件变成了

#ifndef VAR
  #define VAR 1
#endif
Run Code Online (Sandbox Code Playgroud)

bh文件变成了

#ifndef VAR
  #define VAR 2
#endif
Run Code Online (Sandbox Code Playgroud)

注意:头文件可以包含多个宏,而不仅仅是一个宏.

问题:

我们假设啊和bh文件是从第三方库获得的.这些文件不包含#ifndef VAR语句.

我不允许更改其头文件.

我可以在使用VAR宏的myFile.c或myFile.cpp文件中解决宏'VAR'重定义错误吗?

我知道#undef VAR可用于取消定义宏VAR.我怎样才能在我的程序中选择性地包含VAR?即对myfile.c文件代码行10我应该能够指从文件啊VAR的定义,在我的代码的第15行,我应该能够从BH文件和第18行是指VAR再次我应该可以参考来自啊文件的VAR.

总之,我能做宏多态吗?给定头文件的名称,它应该引用该文件中存在的宏定义.

我想过使用命名空间技巧来解决问题.在名称空间中定义第一个头文件,在名称空间中定义第二个头文件.

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

你能建议一些方法吗?

vla*_*adr 8

宏扩展发生在预处理器级别,并且不受命名空间使用的影响.

是否所有宏都要使用简单常量,而不是在标记串联等中使用?

如果是这样,那么您可以尝试类似以下内容来桥接预处理器/编译器间隙并保留对其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;
...
Run Code Online (Sandbox Code Playgroud)


Pét*_*rök 5

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

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

#include "a.h"
Run Code Online (Sandbox Code Playgroud)

更新: @Vlad 同时制定了完整的解决方案 - 向他致敬(和+1 :-)