我有一个主要功能如下:
#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... ...