Подтвердить что ты не робот

Изменение макроса во время выполнения в C

У меня есть макрос. Но мне нужно изменить это значение во время выполнения в зависимости от состояния. Как я могу это реализовать?

4b9b3361

Ответ 1

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

Если вы могли бы объяснить немного больше о цели, которую вы пытаетесь выполнить, несомненно, есть другой способ решить вашу проблему, которая не включает макросы.

Ответ 2

Вы не можете изменить сам макрос, то есть его расширение, но, возможно, вы можете изменить значение выражения, включающего макрос. Для очень глупый пример:

#include <stdio.h>

#define UNCHANGEABLE_VALUE 5
#define CHANGEABLE_VALUE foo

int foo = 5;

int main() {
    printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
    CHANGEABLE_VALUE = 10;
    printf("%d %d\n", UNCHANGEABLE_VALUE, CHANGEABLE_VALUE);
}

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

Конечно, 5 - константа времени компиляции, а foo - нет, поэтому это не сработает, если вы планируете использовать CHANGEABLE_VALUE как метку case или что-то еще.

Помните, что есть два (фактически более) этапа перевода источника C. В первом (из двух, о котором мы заботимся) макросы расширяются. Как только все это будет сделано, программа "синтаксически и семантически анализируется", как это делает 5.1.1.2/2. Эти два шага часто называют "предварительной обработкой" и "компиляцией" (хотя неоднозначно весь процесс перевода также часто упоминается как "компиляция" ). Они могут быть реализованы отдельными программами, при этом "компилятор" запускает "препроцессор" по мере необходимости, прежде чем делать что-либо еще. Таким образом, время выполнения - слишком поздно, чтобы попытаться вернуться и изменить то, что расширяет макрос.

Ответ 3

Вы не можете. Макросы расширяются Preprocessor, что происходит еще до компиляции кода. Это чисто текстовая замена.

Если вам нужно что-то изменить во время выполнения, просто замените свой макрос на реальный вызов функции.

Ответ 4

Вы не можете.

Как макрос разрешается препроцессором перед самой компиляцией, его содержимое напрямую копируется там, где вы его используете.

Вы можете использовать параметры для вставки условного оператора в зависимости от того, что вы хотите, или использовать доступную переменную вызова.

Если вы хотите изменить одно значение, лучше использовать глобальную переменную области видимости, даже если такое поведение не рекомендуется. (как интенсивное использование макроса)

Ответ 5

В зависимости от того, что вы хотите сделать, вы можете сделать это несколькими способами.

Глобальная переменная вместо макроса

// someincludefile.h
extern static int foo;

// someincludefile.c
static int foo = 5;

// someotherfile.c
#include "someincludefile.h"
printf("%d\n", foo); // >> 5
foo = -5;
printf("%d\n", foo); // >> -5

Условие, которое вы можете переключить

// someincludefile.h
extern static int condition;
#define FOO1 (5)
#define FOO2 (-5)
#define FOO (condition ? (FOO1) : (FOO2))

// someincludefile.c
static int condition = 1;

// someotherfile.c
#include "someincludefile.h"
printf("%d\n", FOO); // >> 5
condition = 0;
printf("%d\n", FOO); // >> -5

Условие, которое локально и динамически оценивается

// someincludefile.h
#define CONDITION (bar >= 0)
#define FOO1 (5)
#define FOO2 (-5)
#define FOO ((CONDITION) ? (FOO1) : (FOO2))

// someotherfile.c
#include "someincludefile.h"
int bar = 1;
printf("%d\n", FOO); // >> 5
bar = -1;
printf("%d\n", FOO); // >> -5

В этом последнем состоянии CONDITION будет оцениваться так, как если бы его код находился в вашей локальной области, поэтому вы можете использовать в нем локальные переменные и/или параметры, но вы также можете использовать глобальные переменные, если хотите.

Ответ 6

Я согласен со всеми вашими ответами.. мой случай немного отличается. Я присваиваю значение макроса локальной переменной, иногда получаю значение как ноль, а не значение макроса. Кто-нибудь может объяснить, какой наихудший сценарий для получения проблемы такого типа