首页 > 解决方案 > 通过在 C 中读取 Command_Line 来更改项目的配置

问题描述

这可能是一个愚蠢的问题,但我可以问我如何通过阅读命令行来更改我的 C 项目配置?

例如,我的 C 项目由几个不同的文件组成。而我main()解析命令行的方法是在a.c. 配置,例如,使用多少个线程,命名为num_thread,默认定义为宏,并且能够在使用 cmakelist 的编译中更改,在b.c. 虽然它们位于不同的文件夹中。b但是,的头文件b.h是可见的a.c

我可以指出一些值得注意的事情吗?

那么,有没有办法通过读取命令行参数来改变这样的配置?我知道在运行时更改宏定义是行不通的。因为宏是由预处理器处理并在编译中完成的。但是有没有办法做到这一点?提前致谢。

标签: ccommand-lineconfigurationmacros

解决方案


通常有四种类型的“配置”:

  1. 编译时配置,通过将代码中的变量初始化为固定的编译时常量来设置的默认值。

    就像您num_threads使用宏进行初始化一样。

  2. 从文件中读取的配置。并非所有程序都需要这个。从文件中读取的配置会覆盖编译时配置。

    在您的情况下,可能是您从某个文件中读取了一个数字,然后将该数字分配给num_threads.

  3. 命令行参数。这就是你想知道的。

    对于您的情况,您需要找出对应的参数num_threads,并将值分配给变量。

  4. 运行时配置。可能不适用于您的情况,但运行时可能会发生导致某些配置值更改的事件。这又是一个简单的任务。

配置顺序如表所示,每增加一个杠杆,优先级就递增。并且这种优先级是上述系统中内置的,因为稍后的配置方法会分配或重新分配给变量,从而覆盖先前的值。


对于一个非常简单的示例,假设您只有编译时和参数配置选项。那么可能是这样的:

#define DEFAULT_NUM_THREADS 4

int main(int argc, char *argv[])
{
    unsigned num_threads = DEFAULT_NUM_THREADS;  // The compile-time configuration

    if (argc == 2)
    {
        // Have one argument, this is the new number of threads
        num_threads = strtol(argv[1], NULL, 10);  // Argument configuration
    }

    // Use num_threads here...
}

如果没有传递给程序的参数,该num_thread变量将保留其默认的编译时“配置”值。


推荐阅读