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

发布于 2024-12-01 00:45:17 字数 230 浏览 1 评论 0原文

是否有标准或好的方法来避免声明的常量与定义的常量命名相同。

我的问题,

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

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

有什么建议吗?

Is there a standard or good way of avoiding declared constants being named the same as a defined constant.

My Problem,

Im trying to compile my program using autoconf in linux which defines VERSION but in one of Mongo's db header files they declare a constant named VERSION. There's obviously a problem naming a variable using a right hand value.

Normally I would just change the name but in this case its not my library. I could figure out how to rename the defined variable autoconf.

Any suggestions?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

哥,最终变帅啦 2024-12-08 00:45:17

您必须在 configure.ac 文件中将 no-defineAM_INIT_AUTOMAKE 一起使用。

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

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

请参阅 Automake 手册

You have to use no-define along with AM_INIT_AUTOMAKE in your configure.ac file.

By default this macro AC_DEFINE's PACKAGE and VERSION. This can be
avoided by passing the no-define option, as in:

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

See Automake manual.

源来凯始玺欢你 2024-12-08 00:45:17

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

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

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

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

If you've localized the error, you can do something like this:

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

and then use OLD_VERSION in your code, instead of VERSION. Or just define your version in another namespace.

Also, file a bug in Mongodb. This is not the correct behavior of using just VERSION as a name in the outer namespace. It should check at least if VERSION is already defined, or prefix the variable such as MONGODB_VERSION, or something like that.

假扮的天使 2024-12-08 00:45:17

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

如果 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

或者像迭戈的答案一样使用 #undef 来杀死它)

但是在任何 VERSION 引用的地方这样做都会变得令人讨厌。您只需要不使用 VERSION 即可。

In general there's no good way to safeguard yourself against what some 3rd party library might pollute the global namespace with. This is why god invented namespaces.

You can use namespaces if VERSION is a global symbol known at compile time:

namespace yourStuff
{
    int VERSION;

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

but if VERSION is a preprocessor macro (as I suspect with its capitalization) then it doesn't follow any compilation rules and exists outside the rules of the compiler. You can detect it with other preprocessor macros:

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

(or use #undef like in Diego's answer to kill it)

But doing that everywhere VERSION is references will get nasty. You'll just need to not use VERSION.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文