【发布时间】:2013-09-28 13:01:56
【问题描述】:
我可以使用using namespace 指令来避免标识符/变量名冲突,但是在大型项目中发生文件名或库名冲突时会发生什么。
在C 中,传统的方法是使用#include_next 指令递归地添加文件。如何在不使用#include_next 指令的情况下在C++ 中实现相同的功能,并解决应用程序和共享库之间文件名重复的问题。例如,解决 AIX math.h 中的 class() 函数与名为“class”的标识符冲突的工作。
/* GNU Lesser GPLv2.1 or later */
#ifndef FFMPEG_COMPAT_AIX_MATH_H
#define FFMPEG_COMPAT_AIX_MATH_H
#define class some_text
#include_next <math.h>
#undef class
#endif /* FFMPEG_COMPAT_AIX_MATH_H */
编辑:
我可以使用,例如class machine-instruction-set,二进制文件必须在多个平台上运行吗?这种情况下会不会有命名空间冲突?
【问题讨论】:
-
#include_next到底是什么? -
@AlexandreC。一个GNU extension。我会说,这肯定不是“传统方法”。
-
嗯,我以为它首先出现在 Clang 中,但可能是错误的。
-
传统?
#include_next的使用会导致极大的混乱。我们建议仅在没有其他选择时使用它。特别是,它不应该用在属于特定程序的头文件中;它应该仅用于按照fixincludes进行全局更正。 ― GCC 手册。 -
using namespace经常会给你带来很多问题。尽量不要使用它。相反,您可以使用例如using std::vector。不要包含整个命名空间。
标签: c++ c gcc namespaces