Сравните определенные выражения как текст - PullRequest
0 голосов
/ 24 февраля 2020

Скажем, у меня есть набор определений, упорядоченный таким образом:

#define Var0       ((uint32_t)0x00001)
#define Var1       ((uint32_t)0x00002)
#define Var2       ((uint32_t)0x00004)

и позже в коде у меня это:

#define CurrVar   Var1

Когда я пытаюсь сравнить:

#if (CurrVar != Var1)
   #error "CurrVar" has to be "Var1" for this code to work
#endif

Я получаю:

error: token is not a valid binary operator in a preprocessor subexpression

Я не могу изменить значения VarX, поскольку они являются частью библиотеки, но мне нужно убедиться, что во время компиляции в коде используется правильное значение .

Есть ли способ сравнить эти выражения? Даже если это будет сравниваться как текст, как это:

"((uint32_t)0x00002)" <> "((uint32_t)0x00002)"
or
"Var1" <> "Var1"
etc

Ответы [ 2 ]

3 голосов
/ 24 февраля 2020

Использовать _Static_assert, что соответствует стандарту C, начиная с 2011 года:

_Static_assert(CurrVar == Var1, "CurrVar is not equal to Var1.");

Если необходимо использовать реализацию C до 2011 года, общий клудж для объявления массива введите с отрицательным выражением, если утверждение не выполнено, из-за чего компилятор пожалуется на размер массива:

typedef char CurrVarIsNotEqualToVar1[CurrVar == Var1 ? 1 : -1];
0 голосов
/ 24 февраля 2020

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

https://godbolt.org/z/X2xuPa

#include <stdint.h>

#define V1 1
#define V2 2
#define V3 3

#define CV V1


#if CV==V1
void foo(void)
{
    printf("V1\n");
}
#else
void foo(void)
{
    printf("not V1\n");
}
#endif

int main(void)
{
    foo();
}
...