C++ 如何在C++;文件
在这个问题上,提倡使用非类函数: CPP文件中的变量对于该文件模块来说是本地的,对于该编译单元来说是本地的,这些变量可以就地初始化 但是,如果我想在我的CPP文件中有一个init函数,该怎么办呢 e、 g.一个做作的简单例子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
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冲突问题(如果有两个同名的变量)。大概更改myInit
以返回bool
会使此结果更加整洁,相同的结果?是的,结果将是相同的,只需编辑Init方法:-)大概更改myInit
以返回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请参见编辑。