Я не хочу предварительно обрабатывать определенные макросы. Он не должен заменять его своим значением. Является ли это возможным? - PullRequest
0 голосов
/ 13 октября 2010

Пример =

#define a 100
#define b 200
main()
{
  int c=a+b;
}

После предварительной обработки

Выход-

#define a 100
main()
{
 int c=a+200;
}

Ответы [ 6 ]

1 голос
/ 13 октября 2010

Вы можете попробовать рефакторинг макросов, чтобы разрешить внешнюю конфигурацию, например

/* config.h */

/* set defaults for a and b */
#ifndef a
#define a 100
#endif

#ifndef b
#define b 200 
#endif

и

/* main.c */

#include "config.h"

int main(void) 
{
    int c = a + b;
}

Затем вы можете установить макросы извне при сборке, например, так:

$ gcc -E -Da=a main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"


# 1 "config.h" 1
# 4 "main.c" 2

int main(void)
{
    int c = a + 200;
}
$ gcc -E -Db=b main.c
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"


# 1 "config.h" 1
# 4 "main.c" 2

int main(void)
{
    int c = 100 + b;
}

Теперь, конечно, у вас нет для использования отдельного заголовка конфигурации, но я бы порекомендовал его с точки зрения обслуживания, это облегчит отслеживаниедоступные настройки конфигурации и их настройки по умолчанию.

0 голосов
/ 13 октября 2010

Что касается ответа Питера Миле, unifdef можно использовать для частичной обработки директив #if и #ifdef, но его нельзя использовать для выборочного расширения макросов. Смотри http://dotat.at/prog/unifdef

0 голосов
/ 13 октября 2010

Целью предварительной обработки является обработка директив предварительной обработки.Я не знаю ни одного способа сохранить конкретную директиву предварительной обработки, особенно потому, что следующий шаг, компиляция, ничего об этом не знает.

Это еще одна причина, по которой вам следует соблюдать осторожность при использовании макросов - когда имя найдено в источнике, оно подставляется, несмотря ни на что:

#define a 100

main()
{
    int a; // Compilation error happens here
    ....
}
0 голосов
/ 13 октября 2010

Если вы не хотите предварительно обрабатывать макрос, просто не используйте его:

#define a 100
//#define b 200

int main()
{
    int c = a + 200;

    return 0;
}
0 голосов
/ 13 октября 2010

Нет.Какова твоя настоящая цель?Если вы хотите это сделать, лучше сделать для этого какой-нибудь скрипт.

0 голосов
/ 13 октября 2010
#define a 100
#define b 200
main()
{
 #undef b 
 int c=a+b;
}
...