C++ 如何在C++;文件

C++ 如何在C++;文件,c++,C++,在这个问题上,提倡使用非类函数: CPP文件中的变量对于该文件模块来说是本地的,对于该编译单元来说是本地的,这些变量可以就地初始化 但是,如果我想在我的CPP文件中有一个init函数,该怎么办呢 e、 g.一个做作的简单例子 int x = 6; //this is initialized at program startup int y = 8; 相比 int x,y; void Init() //I want this to be called at startup { //in pra

在这个问题上,提倡使用非类函数:

CPP文件中的变量对于该文件模块来说是本地的,对于该编译单元来说是本地的,这些变量可以就地初始化

但是,如果我想在我的CPP文件中有一个init函数,该怎么办呢

e、 g.一个做作的简单例子

int x = 6; //this is initialized at program startup
int y = 8;
相比

int x,y;
void Init() //I want this to be called at startup
{
 //in practice this would do some more complicated stuff that isn't just init a var
 x=6;
 y=8;
}

如何在启动时调用
Init()

static bool inited = [](){
 Init();
 return true;
}();

您可以尝试以下方法:

static bool inited = [](){
 Init();
 return true;
}();
如何调用一次性初始化函数

一个简单的例子:

namespace {

int init() {
    // in practice this would be more complex
    return 6;
}

int x = init();

}
但是,不建议对外部命名空间范围变量使用动态初始化,因为它们容易受到静态初始化顺序失败的影响。因此,对于外部变量,局部静态变量是更好的选择:

int& x() {
    static int value = init();
    return value;
}

没有“值”[编辑的问题有多个值]

关于编辑的问题:这是课程的目的。例如:

struct descriptive_class_name {
    int x;
    int y;
};

namespace {

descriptive_class_name
init() {
    // in practice this would be more complex
    return {
        .x = 6,
        .y = 8,
    };
}

}


descriptive_class_name&
descriptive_variable_name() {
    static descriptive_variable_name value = init();
    return value;
}
如何调用一次性初始化函数

一个简单的例子:

namespace {

int init() {
    // in practice this would be more complex
    return 6;
}

int x = init();

}
但是,不建议对外部命名空间范围变量使用动态初始化,因为它们容易受到静态初始化顺序失败的影响。因此,对于外部变量,局部静态变量是更好的选择:

int& x() {
    static int value = init();
    return value;
}

没有“值”[编辑的问题有多个值]

关于编辑的问题:这是课程的目的。例如:

struct descriptive_class_name {
    int x;
    int y;
};

namespace {

descriptive_class_name
init() {
    // in practice this would be more complex
    return {
        .x = 6,
        .y = 8,
    };
}

}


descriptive_class_name&
descriptive_variable_name() {
    static descriptive_variable_name value = init();
    return value;
}


类似于:
static bool b=Init(),true。我的想法是让
Init
返回一个值,这样我就可以执行
int dummy=Init()
或者把它放在一个类中,然后让
MyHelperClass M
Jarod建议的与答案中的解决方案类似,它使用。你认为更难懂的味觉;如果您打算在不同的文件中大量使用此类方法,请注意SIOF是一回事,如果您只在一个文件中使用变量,这不是一个问题。但我从经验中知道,这可能很快成为一条死规则,很难发现/执行。但还有一件事,如果您不将变量声明为
static
constepr
或在匿名名称空间中,它对该文件不是私有的,您可能会遇到ODR冲突问题(如果有两个同名的变量)。我的想法是让
Init
返回一个值,这样我就可以执行
int dummy=Init()
或者把它放在一个类中,然后让
MyHelperClass M
Jarod建议的与答案中的解决方案类似,它使用。你认为更难懂的味觉;如果您打算在不同的文件中大量使用此类方法,请注意SIOF是一回事,如果您只在一个文件中使用变量,这不是一个问题。但我从经验中知道,这可能很快成为一条死规则,很难发现/执行。但还有一件事,如果您不将变量声明为
static
constepr
或在匿名名称空间中,它对该文件不是私有的,您可能会遇到ODR冲突问题(如果有两个同名的变量)。大概更改my
Init
以返回
bool
会使此结果更加整洁,相同的结果?是的,结果将是相同的,只需编辑Init方法:-)大概更改my
Init
以返回
bool
会使此结果更加整洁,相同的结果?是的,结果将是相同的,只需编辑init方法:-)这并不能完全捕获所需的结果,在我的例子中,
x
保证在我使用它时被设置。在现实生活中,
Init
可能会执行更复杂的逻辑,比如创建和填充一些复杂的数据结构,它不能只返回值。我认为你的前提仍然存在applies@Mr.Boy后者保证值被初始化,因为获取值的唯一方法是调用初始化值的函数。前者保证,如果调用了
main
,则在访问值之前初始化值,但不保证您是否希望在TU的静态初始化阶段访问对象(这是静态初始化顺序失败)。因此,我建议使用后者。@Mr.Boy您不需要“仅仅”返回值。您可以拥有复杂的数据结构,然后返回值。这里没有“值”,这是我的观点-
init
可能管理许多变量。正如我所说,在方法中“包装”的前提仍然是有意义的。我已经调整了我的问题,以澄清我的想法mean@Mr.Boy请参见编辑。这并不能完全捕获所需的结果,在我的情况下,
x
保证在我使用它时被设置。在现实生活中,
Init
可能会执行更复杂的逻辑,比如创建和填充一些复杂的数据结构,它不能只返回值。我认为你的前提仍然存在applies@Mr.Boy后者保证值被初始化,因为获取值的唯一方法是调用初始化值的函数。前者保证,如果调用了
main
,则在访问值之前初始化值,但不保证您是否希望在TU的静态初始化阶段访问对象(这是静态初始化顺序失败)。因此,我建议使用后者。@Mr.Boy您不需要“仅仅”返回值。您可以拥有复杂的数据结构,然后返回值。这里没有“值”,这是我的观点-
init
可能管理许多变量。正如我所说,在方法中“包装”的前提仍然是有意义的。我已经调整了我的问题,以澄清我的想法mean@Mr.Boy请参见编辑。