如何在C中评估宏?

时间:2010-05-23 13:07:11

标签: c macros

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

CONFIG_IP_MULTIPLE_TABLES的值是如何填充的?

7 个答案:

答案 0 :(得分:12)

您可以通过以下两种方式之一来实现:

#define CONFIG_IP_MULTIPLE_TABLES

对于许多编译器,请在编译命令行中定义它:

cc ... -DCONFIG_IP_MULTIPLE_TABLES

答案 1 :(得分:2)

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

答案 2 :(得分:1)

使用#define。例如:

#define CONFIG_IP_MULTIPLE_TABLES

答案 3 :(得分:1)

我相信这就是你所要求的:

#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)
{
    ...
}

这将评估为

struct fib_table * fib_hash_init(int id)

答案 4 :(得分:1)

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

如果为CONFIG_IP_MULTIPLE_TABLES传递-D,则会定义它。他会发生这种情况。

答案 5 :(得分:1)

CONFIG_IP_MULTIPLE_TABLES是在编译时传递给Linux内核的参数。如果您指的是相同的,则在配置文件中编译内核之前设置参数时进行设置。如果将其设置为Y,则gcc的编译器选项将定义宏。如果设置为N,则未定义。

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

答案 6 :(得分:0)

CONFIG_开头的宏称为配置选项,当您执行make *config时,它们会被填充。此时,您选择要在内核中集成的各种选项。选择完所需的选项后,会生成.config文件,其中包含您选择的各种选项。

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

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