宏在C语言中是如何计算的?

宏在C语言中是如何计算的?,c,macros,C,Macros,CONFIG\u IP\u多个表的值是如何填充的?。例如: #ifdef CONFIG_IP_MULTIPLE_TABLES struct fib_table * fib_hash_init(int id) #else struct fib_table * _ _init fib_hash_init(int id) { ... } 它可以在前面看到的#define语句中,也可以传递给编译器(通常使用-D选项)。您可以通过以下两种方法之一完成: #define CONFIG_IP_MUL

CONFIG\u IP\u多个表的值是如何填充的?
。例如:

#ifdef CONFIG_IP_MULTIPLE_TABLES
struct fib_table * fib_hash_init(int id)
#else
struct fib_table * _ _init fib_hash_init(int id)
{
    ...
}

它可以在前面看到的#define语句中,也可以传递给编译器(通常使用-D选项)。

您可以通过以下两种方法之一完成:

#define CONFIG_IP_MULTIPLE_TABLES
对于许多编译器,请在compile命令行上定义它:

#define CONFIG_IP_MULTIPLE_TABLES

我相信这就是你要问的:

cc ... -DCONFIG_IP_MULTIPLE_TABLES
这将评估为

#define CONFIG_IP_MULTIPLE_TABLES
#ifdef CONFIG_IP_MULTIPLE_TABLES
struct fib_table * fib_hash_init(int id)
#else
struct fib_table * _ _init fib_hash_init(int id)
{
    ...
}

用C语言编译时,首先运行C预处理器(CPP),这是一种简单的宏语言。 属性或绑定通常通过-D参数传递到此预处理器中


如果您为CONFIG_IP_多个_表传递了a-D,那么它将被定义。而ifdef也会发生。

CONFIG\u IP\u MULTIPLE\u TABLES是编译时传递给Linux内核的一个参数。如果您引用的是同一个配置文件,则在编译配置文件中的内核之前设置参数时会设置该配置文件。如果设置为Y,则gcc的编译器选项将定义宏。如果设置为N,则不定义它


在Y的情况下,编译struct fib_table*fib_hash_init(int id),在N struct fib_table*\uu init fib_hash_init(int id)的情况下编译。这是因为#ifdef和#else是预处理器指令,它们是在编译器开始查看代码之前处理的。

CONFIG
开头的宏称为配置选项,它们在执行
make*CONFIG
时填充。此时,您可以选择要集成到内核中的各种选项。选择完所需的选项后,将生成一个包含所选各种选项的
.config
文件

然后创建一个头
include/linux/autoconf.h
,其中包含与配置选项对应的宏的定义。每个编译文件的命令行中都包含此头文件


每个配置选项都在一个Kconfig文件中描述,每个目录通常有一个Kconfig文件。文档中有一个kconfig.txt来描述该语言。

但是上面的代码用于检查内核是否支持某些功能,比如说,我们无法预测如何硬编码
#define
,对吗?不一定在这个文件中。您可以将它添加到另一个文件中(可能包含此文件)或在命令行中,在您的
makefile
等中作为参数提供。因此
struct fib_table*\uu init fib_hash_init(int id)
在这里是无用的?@httpexplain:如果未定义
CONFIG_IP_多个表
,则忽略它。例如,假设此文件包含在另一个文件中。在另一个文件中,您可以定义配置IP多个表,也可以不定义配置IP多个表,这将导致fib表的不同声明
struct fib_table * fib_hash_init(int id)