返回值时的函数指针

Function-pointer when returning values

本文关键字:指针 函数 返回值      更新时间:2023-10-16

我正在使用C语言来升级我的编码技能。

我设计了一个简单的程序,因为我想很容易地找到我想要的问题,并在处理许多问题时安排工作,如下所示。

这是我的头文件

#pragma once
#ifndef PROBLEM_H
#define PROBLEM_H
namespace PROBLEM_1 { int do_main(); }
typedef int(*MAINFUNC)();
#endif 

下面是我的源文件。

#include "problems.h"
#include <stdio.h>
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
using namespace std;
typedef int(*MAINFUNC)(void);
map<string, MAINFUNC> func_map;
void initialize_problem_map(void) {
    func_map["problem_1"] = PROBLEM_1::do_main;
}
namespace PROBLEM_1 {
    int do_main(void) {
        cout << "hi" << endl;
        return 1;
    }
}
int main(void) {
    string problem;
    initialize_problem_map();
    cin >> problem;
    if (func_map.find(problem) != func_map.end())
        return (*(func_map[problem]))();

    return -1;  
}

如果我输入"PROBLEM_1",那么将执行名称空间PROBLEM_1中的do_main函数。我认为这种设计可以帮助我组织多个编码问题。

然而,我的问题是关于这两行代码,如下所示。

if (func_map.find(problem) != func_map.end())
    return (*(func_map[problem]))();

正如您所看到的,main函数的返回类型是"int"。然而,在if子句中,我认为它返回函数指针。因此,我认为这些返回行为与主函数的返回类型不匹配。但是,令我惊讶的是,它运行得很好。

你能解释一下关于退货类型的程序吗?

func_map[problem]实际上会产生一个函数指针。对其应用运算符(),将调用该函数,表达式将生成int。在调用函数指针之前取消引用函数指针是可选的。这是对称的,可选地址采用函数名来初始化函数指针。

确实是

 func_map[problem] 

是一个指针。但是,您用*:取消引用指针

 *(func_map[problem])

并通过添加()调用函数:

 (*(func_map[problem]))()

返回"int"。

find返回一个迭代器;如果这个迭代器是end,那么映射中就不存在问题;因为它不是结束,所以它存在,然后在返回行中,使用[]获得的指针函数来调用它。