Третий фрагмент кода, который у вас есть, не эквивалентен.Обратите внимание на использование оператора запятой :
#define MALLOC(amount) \
( (amount > 0) ? totalAllocatedMemory += amount, malloc(amount) : NULL)
^
N.B.!
Оператор запятой принимает два аргумента, оценивает и отбрасывает первое выражение, затем оценивает и возвращает второе выражение.
троичный условный оператор , используемый таким образом
a = ((b)?(c:d))
эквивалентен этому
if(b) {
a = c;
}
else {
a = d;
}
Оператор запятой, используемый таким образом
e = f, g;
эквивалентно этому
f;
e = g;
Так что если у вас есть
a = ((b)?(f,g:d))
, то это эквивалентно
if(b) {
f;
a = g;
}
else {
a = d;
}
В коде, указанном в вашем исходном сообщении,макрос MALLOC
должен использоваться следующим образом:
memRatiosForNNStructs = (double*)MALLOC(nRadii * sizeof(double));
, что эквивалентно этому:
// First operand of ternary conditional
if(nRadii * sizeof(double) > 0)
{
// Second operand of ternary conditional
// First expression of the comma operator
totalAllocatedMemory += nRadii * sizeof(double));
// Second expression of the comma operator
memRatiosForNNStructs = (double*)malloc(nRadii * sizeof(double));
}
else
{
// Third operand of ternary conditional
memRatiosForNNStructs = (double*)NULL;
}
Честно говоря, это может быть достигнуто как функция в C безпотеря общности:
void* my_malloc(unsigned int amount)
{
if(amount > 0) {
// I assume this is a global variable
totalAllocatedMemory = totalAllocatedMemory + amount;
return malloc(amount);
}
else {
return NULL;
}
}
memRatiosForNNStructs = (double*)my_malloc(nRadii * sizeof(double));
Так что я не уверен, какой смысл даже реализовывать его как труднодоступный макрос.