在cpp文件中
#include "stdio.h"
int fun3() { printf("Hello1\n"); return 0;}
int fun4() { printf("Hello2\n"); return 0;}
int array[] = {fun3(), 1, fun4()};
int main() {
return 0;
}
上方代码能编译并执行,结果如下
Hello1
Hello2
在c文件中
如上代码会直接报错,编译通不过
IDE(CLion)中提示
Initializer element is not a compile-time constant ∶8
你概念太不明确了,你这个代码不是函数做数组元素,而是返回值做数组元素。如果想函数做数组元素,有三种选择:函数指针,自己写仿函数,std::function。
语句int array[] = {fun3(), 1, fun4()};
定义了一个全局变量array为int [3]类型并初始化其元素为初始化列表里的值。
C语言的初始化列表只支持常量表达式或字符串,上面代码用C编译器变量会报错,因为初始化列表里的func3()
, func4()
不是常量表达式
C++语言的初始化列表没有这个限制,因为C++对非局部变量初始化分两个阶段:静态初始化和动态初始化,其中静态初始化相当于C语言的全局变量初始化(即在编译阶段确定其初始值,保存在程序的数据段中,程序加载时直接拷贝到内存里),然后是动态初始化,比如上面代码中调用func3()
和func4()
来初始化数组array的第一个和第三个元素。这些初始化都是在进入main函数之前发生的。
https://en.cppreference.com/w/c/language/initialization
https://en.cppreference.com/w/cpp/language/initialization
可能是语法规定吧,C语言中数组初始化列表必须是编译时计算的常量
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!