【问题标题】:Enum over multiple files, or automatic unique constants over multiple files枚举多个文件,或多个文件的自动唯一常量
【发布时间】:2013-05-16 10:49:28
【问题描述】:

在 C++ 中,有没有办法在编译时自动为多个文件生成常量? 就像枚举在单个文件中自动生成常量一样,但常量在多个文件中必须是唯一的。

例如:

classBase.hpp

classBase{
    //blah blah
};

classA.hpp

class childA : public classBase{
private:
    static const unsigned int mID = NEXT_ID;    
};

classB.hpp

class childB : public classBase{
private:
    static const unsigned int mID = NEXT_ID;    
};

classC.hpp

class childC : public classBase{
private:
    static const unsigned int mID = NEXT_ID;    
};

所以在这种情况下,从 classBase 继承的每个类都会自动分配下一个 ID(0、1、2...)

我猜想有一种方法可以使用 #define s 来实现,但我不知道有什么方法可以在每次分配给它时自动增加 #define,有没有办法做到这一点?

【问题讨论】:

    标签: c++ enums constants c-preprocessor


    【解决方案1】:

    在编译时由您自己生成序列并不容易,但大多数编译器为此目的支持宏:__COUNTER__。它是一个计数器,每次在源代码中使用时都会由编译器本身增加,因此您可以在多个文件中使用它。例如,您的代码可能是:

    class childB : public classBase {
    private:
        static const unsigned int mID = __COUNTER__;    
    };
    

    如果您的编译器不提供该宏(或者您需要对 ID 生成进行更多控制),那么您必须编写更多代码,但可以使用 template metaprogramming 来完成。

    【讨论】:

    • 这听起来不错并且确实有效 :) 我想唯一的问题是如果你想要一个程序中的多个(在这种情况下我不想要),但如果将来有两个或更多需要他们相互冲突。我认为没有任何方法可以将它们分开(__COUNTER__A、__COUNTER__B 等)?编辑:好的,感谢模板元编程链接,我以前没有遇到过。
    • 我更新了(一点点)答案。你可以做到,但你需要更多的代码,用 t.m.您可以按照自己喜欢的方式生成序列(理论上甚至可以使用基于参数或 FILE 哈希的“种子”,例如)。
    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-23
    • 1970-01-01
    • 2015-08-21
    • 2016-01-17
    • 2018-09-14
    相关资源
    最近更新 更多