Вам не нужно ##
в вашем макросе.Это для объединения двух строк в один токен, например, когда вы хотите создать идентификатор (переменную, функцию, ...) 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 );
}