Forwarded from PetrSec 🐞 Notes
__attribute__ в языках С и С++Недавно изучил интересную возможность языка С - атрибуты функций и переменных. К примеру, с помощью атрибутов можно написать код, который выполнится до и после функции
main (#include <stdio.h>
__attribute__ ((constructor)) void before() {
printf("%s\n", "before");
}
__attribute__ ((destructor)) void after() {
printf("%s\n", "after");
}
int main()
{
printf("%s\n", "inside main");
return 0;
}
После запуска этого кода stdout будет таким:
before
inside main
after
__attribute__ были введены в GCC начиная с версии 2.0 , выпущенной в 1992 году как часть расширений, позже вошли в стандарт. Они предоставляют разработчикам гибкость при работе с компилятором, особенно в контексте низкоуровневого программирования, оптимизации и взаимодействия с аппаратным обеспечением.
Атрибуты позволяют:
- Указывать особенности функций, например, что функция является "чистой" (
pure) или "константной" (const), чтобы компилятор мог применять оптимизации.- Контролировать выравнивание данных в памяти
int x __attribute__ ((aligned (16))) = 0;- Управлять порядком инициализации глобальных переменных.
- Запрещать вызов функций, которые нattributeваться
__attribute__((deprecated))attributeлы __attribute__((weak)), которые могут быть переопределены сильными.// Эта функция никогда не возвращает управление
void __attribute__((noreturn)) exit_function() {
while (1);
}
Начиная с C++11 атрибуты так же поддерживаются в плюсах, как часть официального стандарта, до этого при использовании атрибутов компилятор
g++ вызывал gcc чтобы скомпилировать объектные файлы с атрибутами.С момента введения атрибутов в стандарте языка C++, появился новый синтаксис, атрибуты стали записываться через
[[attribute]]. Поэтому сейчас существует разница в синтаксисе:// В стиле GCC
void __attribute__((noreturn)) terminate();
// В стиле C++
[[noreturn]] void terminate();
#cpp
Please open Telegram to view this post
VIEW IN TELEGRAM