函数怎么作为数组元素(C/C++)并调用?

描述

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 constant8

提问∶

  1. 为什么在cpp文件中都能打印输出?分明没有在main函数中调用。
  2. 为什么cpp文件中,所有的函数都发生了调用,而没有只调用第一个函数?
  3. 为什么在c文件中会报错,而不在cpp文件中报错?
  4. c文件中的报错,应该怎么理解和处理?
  5. 如何在数组中正确传入函数作为参数并调用?【通过数组索引调用对应的函数】
  6. 数组中传入函数作为参数有什么缺点?又可能有哪些应用?

你概念太不明确了,你这个代码不是函数做数组元素,而是返回值做数组元素。如果想函数做数组元素,有三种选择:函数指针,自己写仿函数,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语言中数组初始化列表必须是编译时计算的常量

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632