C ++声明的常量命名与定义的常量相同

时间:2011-08-22 21:21:15

标签: macros autoconf automake

是否有一种标准或好的方法可以避免声明的常量与定义的常量相同。

我的问题,

我试图在linux中使用autoconf编译我的程序,它定义了VERSION,但是在Mongo的一个db头文件中,它们声明了一个名为VERSION的常量。使用右手值命名变量显然存在问题。

通常我只会更改名称,但在这种情况下,它不是我的库。我可以弄清楚如何重命名已定义的变量autoconf。

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

您必须在no-define文件中使用AM_INIT_AUTOMAKEconfigure.ac

  

默认情况下,此宏AC_DEFINE的PACKAGE和VERSION。这可以   通过传递no-define选项来避免,如:

     

AM_INIT_AUTOMAKE([gnits 1.5 no-define dist-bzip2])

请参阅Automake manual

答案 1 :(得分:0)

如果您已将错误本地化,则可以执行以下操作:

const unsigned int OLD_VERSION = VERSION;
#undef VERSION
#include <mongodb_header.h>

然后在代码中使用OLD_VERSION,而不是VERSION。或者只是在另一个名称空间中定义您的版本。

另外,在Mongodb中提交一个错误。这不是在外部命名空间中仅使用VERSION作为名称的正确行为。它应至少检查是否已定义VERSION,或者为MONGODB_VERSION之类的变量添加前缀,或类似的内容。

答案 2 :(得分:0)

一般来说,没有什么好方法可以保护自己免受某些第三方库可能污染全局命名空间的影响。这就是上帝发明命名空间的原因。

如果VERSION是编译时已知的全局符号,则可以使用名称空间:

namespace yourStuff
{
    int VERSION;

    // references to VERSION here refer to the inner VERSION, not ::VERSION
}

但是如果VERSION是一个预处理器宏(因为我怀疑它的大小写),那么它不遵循任何编译规则并且存在于编译器规则之外。您可以使用其他预处理器宏检测它:

#ifdef VERSION
 // define it to be something else
#else
#endif

(或者像Diego的回答一样使用#undef杀死它)

但到处都是VERSION引用会变得讨厌。你只需要不使用VERSION。