C++ 能给我一个C++;编译器在编译时实例化对象?

C++ 能给我一个C++;编译器在编译时实例化对象?,c++,optimization,gcc,C++,Optimization,Gcc,我正在编写一些代码,其中包含大量相当简单的对象,我希望在编译时创建它们。我认为编译器可以做到这一点,但我还没有弄清楚如何做到 在C中,我可以执行以下操作: #include <stdio.h> typedef struct data_s { int a; int b; char *c; } info; info list[] = { 1, 2, "a", 3, 4, "b", }; main() { int i; for (i

我正在编写一些代码,其中包含大量相当简单的对象,我希望在编译时创建它们。我认为编译器可以做到这一点,但我还没有弄清楚如何做到

在C中,我可以执行以下操作:

#include <stdio.h>

typedef struct data_s {
    int a;
    int b;
    char *c;
} info;

info list[] = {
    1, 2, "a",
    3, 4, "b",
};

main()
{
   int i;
   for (i = 0; i < sizeof(list)/sizeof(*list); i++) {
     printf("%d %s\n", i, list[i].c);
   }
}
#包括
类型定义结构数据{
INTA;
int b;
char*c;
}信息;
信息列表[]={
1、2、“a”,
3、4、“b”,
};
main()
{
int i;
对于(i=0;i
使用#C++*可以调用每个对象的构造函数,而不仅仅是在内存中进行布局

#include <iostream>
using std::cout;
using std::endl;

class Info {
    const int a;
    const int b;
    const char *c;
public:
    Info(const int, const int, const char *);
    const int get_a() { return a; };
    const int get_b() { return b; };
    const char *get_c() const { return c; };
};

Info::Info(const int a, const int b, const char *c) : a(a), b(b), c(c) {};

Info list[] = {
    Info(1, 2, "a"),
    Info(3, 4, "b"),
};

main()
{
    for (int i = 0; i < sizeof(list)/sizeof(*list); i++) {
        cout << i << " " << list[i].get_c() << endl;
    }
}
#包括
使用std::cout;
使用std::endl;
班级信息{
常数INTA;
常数int b;
常量字符*c;
公众:
信息(常量整型,常量整型,常量字符*);
const int get_a(){返回a;};
const int get_b(){return b;};
const char*get_c()const{return c;};
};
Info::Info(constinta,constintb,constchar*c):a(a),b(b),c(c){};
信息列表[]={
信息(1,2,“a”),
信息(3,4,“b”),
};
main()
{
对于(int i=0;iC++ 2011中的CUT< P>可以在编译时创建对象。但是,要做到这一点,需要做各种各样的常量表达式,但是:

  • 需要声明构造函数
    constexpr
  • 您声明的实体需要声明
    constexpr
  • 请注意,几乎所有的
    常量
    限定符都不相关或位于错误的位置。下面是一个示例,其中有各种更正,并实际演示了
    列表
    数组是在编译时初始化的(通过使用其成员定义
    枚举
    ):

    #包括
    #包括
    班级信息{
    INTA;
    int b;
    字符常量*c;
    公众:
    常量表达式信息(int,int,char const*);
    constexpr int get_a()const{return a;}
    constexpr int get_b()const{return b;}
    constexpr char const*get_c()const{return c;}
    };
    常量表达式信息::信息(整数a、整数b、字符常量*c)
    :a(a)、b(b)、c(c){
    constexpr信息列表[]={
    信息(1,2,“a”),
    信息(3,4,“b”),
    };
    枚举{
    b0=列表[0]。获取_b(),
    b1=列表[1]。获取_b()
    };
    int main()
    {
    
    STD::CUT有一个静态类或单体IDOM。也许这就是C++中你所寻找的答案,你得到的答案是什么?@ NJOZEL C++没有静态类。@ DCOMPLA:我对你的问题的回答是:“C++的方式没有提到”当然,作者假定错误的标题是相对的,它可能给出了实际问题,显然使用C++而不是C.不<代码> A< <代码> >代码> B<代码>,要求<代码> const <代码> > <代码> COSTEXPROGESTA < /C> >是合法的吗?或者可以<代码> conExpRe>代码>对象可修改吗?(我知道它们是私有的,但是如果我在
    Info
    对象上登录
    a
    会发生什么?@ted:成员不需要是
    constepr
    ,因为整个对象都是
    constepr
    。如果你想从一个非
    const
    对象中获取
    constepr
    ,但访问一个成员,那么该成员需要是
    constexpr
    (当然,还有定义此成员的各种其他内容)。感谢您的解释。您是指您的写作地点吗?呃,是的:应该是。
    #include <iostream>
    #include <iterator>
    
    class Info {
        int a;
        int b;
        char const*c;
    
    public:
        constexpr Info(int, int, char const*);
        constexpr int get_a() const { return a; }
        constexpr int get_b() const { return b; }
        constexpr char const*get_c() const { return c; }
    };
    
    constexpr Info::Info(int a, int b, char const*c)
      : a(a), b(b), c(c) {}
    
    constexpr Info list[] = {
        Info(1, 2, "a"),
        Info(3, 4, "b"),
    };
    
    enum {
        b0 = list[0].get_b(),
        b1 = list[1].get_b()
    };
    
    int main()
    {
        std::cout << "b0=" << b0 << " b1=" << b1 << "\n";
        for (Info const* it(list), *end(list); it != end; ++it) {
            std::cout << (it - list) << " " << it->get_c() << "\n";
        }
    }