函数名作为C中main的参数

前端之家收集整理的这篇文章主要介绍了函数名作为C中main的参数前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个主要功能如下:
#include <stdio.h>

int main(int argc,char *argv[])
{
    int i,sum = 0;
    char *func_user = argv[1];

    // execute func_user function

    return 0;
}

void foo1(void)
{
    printf("I'm foo1.");
}

void foo2(void)
{
    printf("I'm foo2.");
}

void foo3(void)
{
    printf("I'm foo3.");
}

我希望用户将他的函数名称作为main的参数,我希望我的程序执行这个给定的函数.有没有办法做这个(比如使用反射)而不使用switch / case方法

解决方法

你不能直接这样做,因为C既不具有 introspection也不具有 reflection.你必须自己将名称(字符串)映射到(指向a)函数.

一种不常见的创建这种映射的方法是使用具有该信息的结构,然后对所有函数使用这些结构的数组.然后迭代数组以查找名称及其函数指针.

也许是这样的

struct name_function_map_struct
{
    char *name;             // Name of the function
    void (*function)(void); // Pointer to the function
};

// Declare function prototypes
void foo1(void);
void foo2(void);
void foo3(void);

// Array mapping names to functions
const struct name_function_map_struct name_function_map[] = {
    { "foo1",&foo1 },{ "foo2",&foo2 },{ "foo3",&foo3 }
};

int main(int argc,char *argv[])
{
    // Some error checking
    if (argc < 2)
    {
        // Missing argument
        return 1;
    }

    // Calculate the number of elements in the array
    const size_t number_functions = sizeof name_function_map / sizeof name_function_map[0]

    // Find the function pointer
    for (size_t i = 0; i < number_functions; ++i)
    {
        if (strcmp(argv[1],name_function_map[i].name) == 0)
        {
            // Found the function,call it
            name_function_map[i].function();

            // No need to search any more,unless there are duplicates?
            break;
        }
    }
}

// The definitions (implementations) of the functions,as before...
...

猜你在找的C&C++相关文章