如何解决头文件中的变量冲突?

时间:2019-04-24 05:08:33

标签: c++ visual-studio-2017

我正在OpenSees(主要用Visual Studio C ++编写的开源地震工程仿真项目)中编写自适应步长更新算法。我在两个不同的头文件(即 windef.h steelz01.h )中具有相同名称的两个变量之间遇到冲突。我需要一种解决此冲突的方法。

我在项目中使用 gnuplot-iostream.h ,仅当包含此头文件时,我才会遇到此冲突,否则就没有冲突,代码可以完美地构建。

基本上 gnuplot-iostream.h 会调用 windows.h ,而后者又会调用 windef.h 。我已经在steelz01.h文件中添加了包括gauards,但是它不能解决问题。

当我将steelz01.h中的varaibale名称更改为其他名称时,代码也将完美构建。找不到问题。但是,我不想更改steelz01中变量的名称,它具有严重的影响。

我包含这样的头文件

#include "gnuplot-iostream.h"
#include <SteelZ01.h>

这是在steelz01中定义变量SIZE的方式

#define LOOP_NUM_LIMIT               30
const int SIZE = LOOP_NUM_LIMIT; //limit of array number

在windef.h中,定义如下

typedef struct tagSIZE
{
    LONG        cx;
    LONG        cy;
} SIZE, *PSIZE, *LPSIZE;

typedef SIZE               SIZEL;
typedef SIZE               *PSIZEL, *LPSIZEL;

Visual Studio 2017抛出此错误,

1>c:\program files (x86)\windows kits\8.1\include\shared\windef.h(190): error C2378: 'SIZE': redefinition; symbol cannot be overloaded with a typedef

1>e:\phd working folder\0_ops_github\src\material\nd\reinforcedconcreteplanestress\steelz01.h(17): note: see declaration of 'SIZE'

我期待一种解决此冲突和成功构建的方法。

1 个答案:

答案 0 :(得分:1)

我建议您将include语句放在命名空间中,

namespace ABC
{
    #include "gnuplot-iostream.h"
}

namespace PQR
{
   #include <SteelZ01.h>
}

致电:

ABC::SIZE
PQR::SIZE

这不会更改现有库的任何代码。但是,使用通用名称的图书馆作者因此建议他将通用名称保留在名称空间下,以减少任何冲突。