C ++-通过宏定义的名称空间-如何在标头中使用它

时间:2019-08-25 14:57:36

标签: c++ header namespaces

我有一些代码,其中的名称空间可由用户配置为:

#pragma once

#ifdef GRAPHICS_NAMESPACE
namespace GRAPHICS_NAMESPACE {
#endif

class Foo {
}

#ifdef GRAPHICS_NAMESPACE
}
#endif

在cpp文件中,有

#ifdef GRAPHICS_NAMESPACE
using namespace GRAPHICS_NAMESPACE;
#endif

现在我有问题。我定义了-DGRAPHICS_NAMESPACE=Graphics,并且有一个标头:

#pragma once

#include "Foo.h"

class Bar {
   Foo foo;
}

但是Foo foo给了我错误,因为Foo在现在命名为Graphics的命名空间中。我可以通过添加

来解决此问题
#ifdef GRAPHICS_NAMESPACE
using namespace GRAPHICS_NAMESPACE;
#endif

到我的标头,但这不是很安全,因为它将在我包含标头的所有地方使用命名空间。还有其他解决方案吗?

2 个答案:

答案 0 :(得分:2)

我会这样:

  const config = {
    headers: {
      "Content-Type": "multipart/form-data"
    }
  };

  const response = await axios.post(
    `http://${GATEWAY}:5000/api/uploads/single`,
    data,
    config
  );

答案 1 :(得分:2)

尽管我会说这不是安排事物的最佳方式,但我看到的情况更糟,并且解决问题的方法也很简单:

#ifdef GRAPHICS_NAMESPACE 
#define GRAPHICS GRAPHICS_NAMESPACE 
#else
#define GRAPHICS 
#endif

...

GRAPHICS::Foo 

如果您坚持使用此设计,则可以通过定义第二个宏来对其进行某种程度的清理:

class Bar {

#ifdef GRAPHICS_NAMESPACE
GRAPHICS_NAMESPACE::
#endif
   Foo foo;
}

然后按照以下内容声明内容:

#ifdef GRAPHICS_NAMESPACE
#define GRAPHICS_CLASS(x)  GRAPHICS_NAMESPACE:: x
#else
#define GRAPHICS_CLASS(x)  x
#endif

最后,如果您坚持依赖预处理器来实现这种关键功能,则可能需要考虑花费更多时间阅读C ++书中关于该主题的内容。这些是C ++预处理器的相当基本,直接的用法,我希望在任何有关C ++预处理器及其工作原理的介绍中都应充分解释。