Как макросы оцениваются в C? - PullRequest
2 голосов
/ 23 мая 2010
#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 ]

12 голосов
/ 23 мая 2010

Это можно сделать одним из двух способов:

#define CONFIG_IP_MULTIPLE_TABLES

Для многих компиляторов определите его в командной строке компиляции:

cc ... -DCONFIG_IP_MULTIPLE_TABLES
2 голосов
/ 23 мая 2010

Это может быть либо в операторе #define, который был замечен ранее, либо передан компилятору (обычно с использованием опции -D).

1 голос
/ 23 мая 2010

CONFIG_IP_MULTIPLE_TABLES - это параметр, передаваемый ядру Linux во время компиляции. Если вы ссылаетесь на то же самое, оно устанавливается при настройке параметров перед компиляцией ядра в файле конфигурации. Если установлено значение Y, опция компилятора для gcc определяет макрос. Если установлено значение N, оно не определено.

В случае Y скомпилируется struct fib_table * fib_hash_init (int id), а в случае N struct __init fib_hash_init (int id). Это связано с тем, что #ifdef и #else являются директивами препроцессора, и они обрабатываются до того, как компилятор сам начнет искать код.

1 голос
/ 23 мая 2010

Когда вы компилируете в C, сначала запускается C Pre Processor (CPP), который является простым языком макросов. Свойства или привязки передаются в этом препроцессоре обычно с аргументом -D.

Если вы передали -D для CONFIG_IP_MULTIPLE_TABLES, он будет определен. и он ifdef случится.

1 голос
/ 23 мая 2010

Я считаю, что это то, что вы спрашиваете:

#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)
1 голос
/ 23 мая 2010

Использование #define. Например:

#define CONFIG_IP_MULTIPLE_TABLES
0 голосов
/ 23 мая 2010

Макросы, начинающиеся с CONFIG_, называются параметрами конфигурации, они заполняются, когда вы делаете make *config.На этом этапе вы выбираете различные опции, которые вы хотите интегрировать в ядро.Когда вы закончите выбирать нужные параметры, будет создан файл .config, содержащий различные выбранные параметры.

Затем создается заголовок include/linux/autoconf.h, который содержит определение макросов, соответствующих опции конфигурации.Этот заголовок включен в командную строку для каждого скомпилированного файла.

Каждый параметр конфигурации описан в файле Kconfig, обычно в каждом каталоге находится один файл Kconfig.В документации, описывающей язык, есть файл kconfig.txt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...