Что такое __attribute __ ((не используется)) статично? - PullRequest
0 голосов
/ 06 октября 2018

В libuv файле heap-inl.h , я вижу следующий макрос

#if defined(__GNUC__)
# define HEAP_EXPORT(declaration) __attribute__((unused)) static declaration
...
HEAP_EXPORT(void heap_init(struct heap* heap));
...

heap-inl.h включен в исходный файл loop.c, который затем используетобъявленная функция heap_init.

Из того, что я интерпретирую ...

  • heap-inl.h обозначает кучу "inline"?
  • HEAP_EXPORT равно экспорт функция, которая будет использоваться другими исходными файлами.

Я не понимаю, почему экспортированная функция помечена __attribute((unused))__.Кроме того, почему это также объявление static?Я думал, что static функции могут использоваться только в файле, в котором они определены. Кроме того, какое отношение встраивание имеет к какому-либо из этого?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Как описано здесь :

unused

Этот атрибут, прикрепленный к функции, означает, что функция, возможно, не используется.GCC не будет выдавать предупреждение для этой функции.GNU C ++ в настоящее время не поддерживает этот атрибут, поскольку определения без параметров действительны в C ++.

Этот атрибут также имеет дополнительное преимущество, заключающееся в том, что в зависимости от обстоятельств функция может вообще не быть запущена (она не будет использовать пространство в скомпилированном файле), если она никогда не вызывается.

Это часто используется с static функциями в библиотеках заголовков, поэтому в качестве машинного кода передаются только те функции, которые фактически используются, и предупреждения избегаются.

0 голосов
/ 06 октября 2018

Ключевое слово static указывает, что функция является локальной для скомпилированного файла.Когда он находится в заголовке, это означает, что он включен во все скомпилированные файлы.Тогда проблема в том, что если эта функция не используется, некоторые компиляторы (clang, gcc, VS с соответствующими файлами) будут генерировать предупреждение.Пометка функции как неиспользуемой удалит это предупреждение (и потенциальную ошибку, если предупреждение считается ошибкой).

Так что HEAP_EXPORT на самом деле ничего не экспортирует, просто делает функцию доступной (если тело такжев заголовке, который имеет место, если файл имеет имя -inl, что действительно указывает на то, что содержимое будет встроено в скомпилированный файл).

...