Я хотел бы внести изменения так, как работает некоторый код, переопределив макрос, используя старое значение макроса. Однако из-за того, что макросы кажутся оцененными, это не работает для меня. То, что я хотел бы для непосредственной оценки макроса в #define
, так что-то вродекак принудительно оценивать макросы в #define для c-preprocessor
#define A B
определяет A
быть значение B
в момент #define
, а не зависеть от переопределения B
в позднее.
Этот пример работает:
// in a header somewhere, can't change this
#define A 1
// wrapper code to replace the number with a run-time expression
#define OLD_A 1
#define NEW_A 42
#undef A
bool flag = false;
#define A (flag ? NEW_A : OLD_A)
// user code, don't want to change this
//
#include <stdio.h>
main()
{
flag = false;
printf("A is %d\n",A);
flag = true;
printf("A is %d\n",A);
}
Output (по назначению):
1$ ./cpptest
A is 1
A is 42
Однако, если изменить определение OLD_A
к A
, то он не компилируется.
// in a header somewhere, can't change this
#define A 1
// wrapper code to replace the number with a run-time expression
#define OLD_A A /// <------ here
#define NEW_A 42
#undef A
bool flag = false;
#define A (flag ? NEW_A : OLD_A)
// user code, don't want to change this
//
#include <stdio.h>
main()
{
flag = false;
printf("A is %d\n",A);
flag = true;
printf("A is %d\n",A);
}
Сложение терпит неудачу:
$ make cpptest
icpc cpptest.cpp -o cpptest
cpptest.cpp(19): error: identifier "A" is undefined
printf("A is %s\n",A);
^
Я понимаю, что это ужасный способ разработки кода, чтобы быть ремонтопригодны, но это патч к разовому старого выпуска, и в этом случае он делает для меня это имеет смысл, так как это требует меньших изменений в другом рабочем коде.