Вопрос: Не могли бы вы помочь мне лучше понять макрос RAII на языке C (а не C++), используя только ресурсы, которые я поставлю в нижней части этого вопроса? Я пытаюсь проанализировать это в своем уме, чтобы понять, что он говорит и как это имеет смысл (это не имеет смысла в моем сознании). Синтаксис сложный. В центре внимания вопроса: у меня проблемы с чтением и пониманием странного синтаксиса и его реализации на языке C. Например я могу легко читать, понимать и анализировать (это имеет смысл для меня) следующий своп макрос:Приобретение ресурсов Инициализация в C lang
#define myswap(type,A,B) {type _z; _z = (A); (A) = (B); (B) = _z;}
(следующий отрывок поднимается из книги: Понимание указателей C)
В языке C компилятор GNU обеспечивает нестандартное расширение до поддержка RAII.
Расширение GNU использует макрос, называемый RAII_VARIABLE. Он объявляет переменную и связывает с переменной:
- Тип
- Функция для выполнения, когда создается переменная
Функция для выполнения, когда переменная выходит из области видимости
макросов приведен ниже:
#define RAII_VARIABLE(vartype,varname,initval,dtor) \ void _dtor_ ## varname (vartype * v) { dtor(*v); } \ vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
Пример:
void raiiExample() { RAII_VARIABLE(char*, name, (char*)malloc(32), free); strcpy(name,"RAII Example"); printf("%s\n",name); } int main(void){ raiiExample(); }
Когда эта функция выполняется, строка «RAII_Example» будет отображаться. Аналогичные результаты могут быть достигнуты без использования расширения GNU.
Мне не нравится этот метод, это не похоже на C. – Stargateur
Зачем использовать этот макрос вместо ... с помощью C++? –
В центре внимания вопроса: не могли бы вы помочь мне лучше понять макрос RAII на языке C? Я борюсь с синтаксисом и тем, как он реализован в Clang. Я знаю, что он делает (выделяет и освобождает память .....). :) – Mynicks