Что такое комментарий #pragma (lib, "lib / glut32.lib")? - PullRequest
3 голосов
/ 04 октября 2010

Я увидел код в верхней части демонстрации GLUT, и мне интересно узнать о его функциональности.

Почему кто-то хочет написать #pragma вместо простого включения библиотеки?

Ответы [ 3 ]

3 голосов
/ 04 октября 2010

Эта прагма позволяет автору библиотеки определять импорт библиотеки на основе ряда критериев, которые могут быть проанализированы во время компиляции.Например, вы можете ссылаться на разные библиотеки, в зависимости от того, хотите ли вы связать с:

  • многопоточностью, включенной или выключенной;
  • общей или статической версией рассматриваемой библиотеки;
  • общая или статическая версия стандартной библиотеки времени выполнения;
  • библиотека отладки или выпуска;
  • 32-разрядная или 64-разрядная библиотека.

С формой pragma все это можно решить с помощью #ifdef тестов препроцессора в одном из заголовочных файлов библиотеки.

1 голос
/ 04 октября 2010

Это MSVC-специфическая прагма , что означает, что указанная библиотека будет автоматически включена во время ссылки.Остальная часть вашего вопроса о «просто включении библиотеки» предполагает, что вы не цените разницу между заголовками и библиотеками: заголовок (GL/glut.h) описывает, какие функции компилятор может ожидать во время компоновки.Библиотека (lib/glut32.lib) обеспечивает реализацию этих функций.

Как объяснили другие ответы, это может быть удобно, но лично я считаю ужасной идеей использовать это, потому чтоэто добавляет еще один барьер для написания переносимого кода (другие платформы и компиляторы могут не поддерживать его). Этот вопрос (спасибо, @martin clayton) объясняет, почему это не очень хорошая идея для переносимого кода.

1 голос
/ 04 октября 2010

#pragma полезно, если вы распространяете библиотеку.Особенно, если у вас есть разные скомпилированные библиотеки .lib для разных настроек сборки (например, отладка против выпуска, многопоточная среда выполнения C против однопоточной, DLL против статической библиотеки и т. Д.).Вы можете использовать #ifdef s в своем коде, чтобы выбрать правильный файл .lib, вместо того, чтобы требовать от своих пользователей настройки среды сборки для выбора правильного.

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

...