如何在C或c++中初始化全局数组
How can I initialize an array globally in C or C++?
我正在尝试这样做:
for(int k=0; k<context.size(); k++)
{
cc_no_issue[k]=0;
}
谁能告诉我如何在全球范围内做到这一点?每当我尝试,我得到这些错误:
预期的非限定id在"for"前
K没有定义类型
K没有定义类型
这样做:
long cc_no_issue[100]={0};
这是正确的初始化。
注意:这将初始化所有内容为0。
这句话:
long cc_no_issue[100]={1,2};
将设置cc_no_issue[0]
为1,cc_no_issue[1]
为2,其余为0。您可以查看上面的链接了解更多信息
如果你有一个基本类型的全局数组,
int some_array[1000];
将自动初始化为零。您不必初始化它。如果您确实需要运行初始化代码,您可以执行如下hack(在c++中):
struct my_array_initializer {
my_array_initializer() {
// Initialize the global array here
}
};
my_array_initializer dummy_variable;
如果您使用的是GCC(或Clang),您可以在main
之前执行带有constructor
属性的代码:
__attribute__((constructor))
void initialize_array()
{
// Initialize the global array here
}
所有全局变量(文件范围内的变量)默认初始化为零,因为它们具有静态存储持续时间(C99 6.7.8.10)。所以严格来说,你不需要将它们初始化为零,C标准保证它们默认为零。
然而,正如Ziyao Wei在回答中提到的那样,显式初始化它们是良好的编程实践。
不行,函数之外不能有代码。
你可以把它放在某个函数中,从main
开始调用。
一种方法是添加一个全局函数
- 检查数组是否初始化
- 初始化未初始化的数组
- 返回数组
示例代码:
int* get_cc_no_issue()
{
if(!kIsMyArrayInitialized)
{
/* todo: somehow get "context" globally... */
for(int k = 0; k < context.size(); k++)
{
cc_no_issue[k] = 0;
}
kIsMyArrayInitialized = true;
}
return cc_no_issue;
}
如果你想要非零初始化,这是非常有用的。
对于零初始化,参见对另一个问题的回答:全局内存在c++中初始化吗?
可以把数组放在全局对象的构造函数中。
int cc_no_issue[256];
struct Init {
Init(int a, unsigned int size)
{
memset(a, 0, size);
}
};
Init arr(cc_no_issue, sizeof(cc_no_issue));
作为@Bo Persson,在函数中进行。但是,在c++中已经有一种算法可以帮你做到这一点。不需要写一个手写的循环
std::fill(cc_no_issue, cc_no_issue+context.size(); 0) ;
关于std::fill的更多信息
回复你的评论:
要使每个元素自增,可以使用std::for_each传递一个函数对象作为第三个参数。
#include <iostream>
#include <algorithm>
using namespace std;
void incrementHelper( int& a ){
++a;
}
int main(){
int ar[] = { 1,2,3,4,5 };
for_each(ar, ar+5, incrementHelper );
for( int i=0; i<sizeof(ar)/sizeof(ar[0]); ++i ){
cout << ar[i] << endl;
}
return 0;
}
输出:
2
3
4
5
6
for_each(ar, ar+5, incrementHelper);
对于数组中的每个元素,算法将调用函数incrementHelper
。在C术语中,也就是说,它作为对数组中每个元素的回调。现在回调函数通过引用接收传递的元素。所以,修改引用也会修改被引用。
你需要决定语言。这方面的机制在C和c++中是不同的。基本上,C没有在主函数开始之前运行代码的方法,所以你不能在C中对数组进行复杂的初始化。在c++中,你确实有一些选择,一种是停止使用裸数组(这是一个C结构),而是将数组包装在类中,并在类构造函数中进行初始化。
CC cc_no_issue;
class CC
{
public:
CC()
{
// initialisation of array goes here
}
private:
int array[100];
};
另一种方法是使用vector,并编写函数来初始化vector。
std::vector<int> cc_no_issue = init_vector();
std::vector<int> init_vector()
{
std::vector<int> tmp;
// initialisation of tmp goes here
return tmp;
}
- 使用 std::ios_base::Init 正确初始化全局变量
- 在 glsl 中初始化全局变量?
- 未显式初始化C++全局变量时发出警告?
- 定义,初始化全局const变量是安全的吗?
- 如何懒惰地初始化全局变量?
- 初始化全局变量时,Clang-4.0会生成冗余方法
- 可以(通过编译器)使用多少个线程来初始化全局对象(函数main之前)
- "multiple definition of value"在 g++ 中编译具有未初始化全局但不是 gcc 的 C 程序时
- 在c++中,全局作用域中只允许"表达式"初始化全局对象.我在哪里可以在标准中找到这个
- 通过写入全局llvm的地址从执行引擎外部初始化全局llvm值有效吗
- 何时使用外部链接初始化全局常量,避免静态初始化顺序惨败
- 声明和初始化全局 2D 数组
- c++初始化全局对象AFTER fork
- c++中如何初始化全局作用域的静态成员
- 条件运算符是在全局作用域中初始化全局变量的唯一方法
- 在共享库中初始化全局数据的最佳方法是什么?
- 如何在C或c++中初始化全局数组
- 交叉初始化全局(外部)变量
- 强制在某个静态字段之前初始化全局变量
- 初始化全局函数内的静态成员