## использование макропроцессора - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь использовать макро и ## предварительную обработку для выполнения операции ниже

#define SUM_RESULT(SrcVar, Var1, Var2, Var3, Sum) \
SrcVar-> ## Var1 = 10;\
SrcVar-> ## Var2 = 10;\
SrcVar-> ## Var3 = 10;\
Sum = SrcVar-> ## Var1 + SrcVar-> ## Var2 + SrcVar-> ## Var3;

typedef struct _MyVariable
{
  int a;
  int b;
  int c;
}MyVariable;

int main()
{
  MyVariable *TotalVar;
  int Result = 0;

  //Allocating memory
  TotalVar = malloc(2 * sizeof(TotalVar));

  // Expecting to replace as below result
  // initialization
  // TotalVar->a=10;
  // TotalVar->b=10; 
  // TotalVar->c=10;
  // Sum = TotalVar->a + TotalVar->b + TotalVar->c;

  // macro replacement
  SUM_RESULT(TotalVar, a, b, c, Result);

  // Display result of sum of a, b, c
  printf("%d\n", Result);

  return 0;

}

, но она показывает неопределенную ошибку для аргумента a, b, c, Результат

SUM_RESULT(TotalVar, a, b, c, Result);

Любой указатель поощряет к продолжению ...

1 Ответ

0 голосов
/ 23 ноября 2018

Вам не нужно ## в вашем макросе.Это для объединения двух строк в один токен, например, когда вы хотите создать идентификатор (переменную, функцию, ...) foobar из foo и bar, который может быть передан в качестве отдельных аргументов макроса.

Дополнительные проблемы:

  • Неправильный порядок в вашем typedef.
  • MyVariable *TotalVar - неинициализированный указатель.Вы должны определить некоторую переменную MyVariable.
  • Вы должны заключать аргументы макроса в скобки, если это не приведет к синтаксической ошибке.
  • Вы должны заключить код макроса в do { ... } while(0), чтобы заставить его работать в любом контексте.

Результаты могут зависеть от используемого вами компилятора.Я попробовал это с https://www.onlinegdb.com/

Вот модифицированная версия вашей программы, которая на самом деле работает

/* Using this "do { ... } while(0)" construction allows the macro to
   work correct when used in e.g.
   if(foo)
     SUM_RESULT(TotalVarPtr, a, b, c, Result);
   else
     SUM_RESULT(somethingElse, a, b, c, Result);
 */
#define SUM_RESULT(SrcVar, Var1, Var2, Var3, Sum) \
do {\
(SrcVar)-> Var1 = 10;\
(SrcVar)-> Var2 = 11;\
(SrcVar)-> Var3 = 12;\
Sum = (SrcVar)-> Var1 + (SrcVar)-> Var2 + (SrcVar)-> Var3; \
} while(0)

typedef struct
{
  int a;
  int b;
  int c;
} MyVariable;

int main()
{
  MyVariable TotalVarValue = {0};
  MyVariable *TotalVarPtr = &TotalVarValue;
  int Result = 0;

  SUM_RESULT(TotalVarPtr, a, b, c, Result);
  printf("%d\n", Result);
  printf("a %d b %d c %d\n", TotalVarPtr->a, TotalVarPtr->b, TotalVarPtr->c );

  /* This requires to use (SrcVar) in the macro */
  SUM_RESULT(&TotalVarValue, a, b, c, Result);
  printf("%d\n", Result);
  printf("a %d b %d c %d\n", TotalVarValue.a, TotalVarValue.b, TotalVarValue.c );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...