gpt4 book ai didi

c++ - 预处理器 : generate functions with dynamic name. 多重定义问题

转载 作者:太空宇宙 更新时间:2023-11-04 02:08:03 25 4
gpt4 key购买 nike

我得到了一个预处理器宏,它根据宏参数生成函数和变量。

用 A、B 依次调用宏,宏会生成类似的东西

Inst* AActivate() { ... }
bool Atemp;

Inst* BActivate() { ... }
bool Btemp;

由于宏是在头文件中定义的,因此我收到链接器错误,通知我有关已定义符号的信息。我使用的是#pragma once,但我猜问题在于在 header 中实现函数。

这是宏:

    #define REGISTER(ns, id, type) \
Inst* type##Activate() { return new type(); }\
bool type##temp = RegisterType(ns << 8 | id, &type##Activate);

现在我想知道如何处理这些问题。我的第一个想法是使用一些#define-Guards,但显然这需要嵌套的#defines,这在 C++ 中是不可能的。我阅读了有关 boost 的可能解决方案,但不幸的是,我无法使用这些库。

有什么想法吗?

提前致谢...

最佳答案

您的宏会在 header 中生成函数定义,并且与任何普通函数一样,如果 header 包含在多个翻译单元中,则 header 中的非内联函数会违反 ODR。所以只需将生成的函数内联。

对于全局变量,ODR 也适用,您必须将它们声明为 static 或 const 以获得内部链接。这反过来会给你多个独立的变量实例,一个包含标题的每个翻译单元。不管怎样,全局变量被认为是糟糕的风格,所以也许你应该想想别的东西。

关于c++ - 预处理器 : generate functions with dynamic name. 多重定义问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18529634/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com