如何避免在使用此configurtation每一个函数传递配置变量(How to avoid Pas

2019-10-20 02:18发布

我怎样才能避免传递“配置”变量中,使用此配置中的每个功能。 是什么使这样一个行为的最准确的方法。

这是我的代码:main.c中

/* Complex Numbers Linking to proper variable */
typedef struct tagConfigNames {
    char name;
    complex *cnum;
} config_names;

/* Set command to function */
struct {
    char *name;
    void (*func)(config_names[]);
} cmd[] = {{"read_comp", read_comp}, {"print_comp", print_comp}, {"halt", halt},{"not_valid", NULL} };

int main()
{
    complex a,b,c,d,e,f;
    config_names cnumbers []= {{'a', &a}, {'b', &b}, {'c', &c}, {'d', &d}, {'e', &e}, {'f', &f},
                {'A', &a}, {'B', &b}, {'C', &c}, {'D', &d}, {'E', &e}, {'F', &f},
                {'#', NULL}};
    char command[30];
    int i;

    /* Run Forever */
    while(1) 
    {
        if (scanf("%s", command) == 1) {
            for (i = 0; cmd[i].func != NULL; ++i) {
                if (strcmp(command, cmd[i].name) == 0) 
                    break;
            }

            if (cmd[i].func == NULL) {
                printf("Error: no such command!\n");
            } else {
                (*(cmd[i].func))(cnumbers);
            }
        }
    }

    return 0;
}

complex.c里

complex* find_complex_number(config_names cnames[], char ch)
{
    int i;
    for (i = 0; cnames[i].cnum != NULL; i++) {
        if (cnames[i].name == ch)
            break;
    }

    return cnames[i].cnum;
}

void read_comp(complex_names cnames[]) 
{
    //....

    if ((complex_num = find_complex_number(cnames, ch)) == NULL) {
        printf("Error: No such complex number\n");
        return;
    }
    //....
}

我所actully试图避免的是config_names cnumbers这是在每一个功能通过。 有接近这样的行为更聪明的方式?

编辑:

我需要声明复杂A,B,C,d,E,F; 仅在main.c文件。 这就是为什么我回避的全局变量

Answer 1:

如果“ 配置 ”是应用程序的每个线程固定,你可能会考虑全局定义它。



Answer 2:

如果配置为常数每个线程,或者你不使用线程,你可以使用全局变量。 否则,你可以使用线程本地存储 ,它会像一个全局变量,但具体到每个线程。



Answer 3:

为了扩大上述情况,你可能希望搜集根据该文件中的所有功能,并进行全球(或线程局部)变量static存在,从而保持polution到最低限度。



文章来源: How to avoid Passing config variable in every function which uses this configurtation
标签: c ansi