C ACCB1 ACCB2

#c

Вопрос:

Это основной вопрос . Будьте добры, покажите мне, где мне следует искать . Я смотрю на код C , который выглядит следующим образом

 ACCB1 void ACCB2 MyPluginCommand(void *clientData)
 

Когда я ищу их в базе кода, я вижу, что они просто

 #define ACCB1
#define ACCB2
 

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

Я много раз видел такого рода коды, но никогда по-настоящему не понимал . Для C я понимаю , что имя функции, тип возвращаемого значения и аргументы достаточны . Чем нам помогают эти переменные и как их обрабатывает компилятор

Комментарии:

1. Вы уже понимаете, почему они могут быть использованы, но без того, чтобы их на самом деле определяли как что-то (а не как ничто), мы так же в неведении, как и вы.

2. общий заголовок для библиотеки и потребителя библиотеки. Одна из них-функция экспорта, другие функции импорта. Макросы просто помогают различать эти сценарии.

3. Снова открылся. В вопросе конкретно упоминается, что это не для DLL, поэтому не закрывайте его как дубликат, предполагая, что он предназначен для DLL.

4. I am looking at a C code Куда? Давайте посмотрим! Почему бы не разместить ссылку? looks like this Мы не можем догадаться по «похоже на это», каким должен быть настоящий код. Опубликуйте реальный код.

5. Любой автор записывал макросы в объявление функции, чтобы удобно добавить что-то в это объявление (например, declspec или атрибуты). Эти макросы в настоящее время не используются, т. е. расширяются до нуля. ИМХО, автор мог бы оставить комментарий о том, как они предназначены для использования. А так это просто загадка… 😉

Ответ №1:

Поскольку вы упомянули, что это не для библиотек DLL : оно может использоваться для атрибутов, таких как [[deprecated]] .

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

Ответ №2:

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

Например:

 #define SERIALIZABLE
...
SERIALIZABLE struct MyStruct
{
    SERIALIZABLE int value = 0;
    int someOtherValue = 0;
};
 

SERIALIZABLE тег здесь ничего не делает для компилятора, но он может включить внешний инструмент, который анализирует этот файл для генерации кода сериализации MyStruct , а точнее, только для value элемента from MyStruct . Без тега инструменту было бы очень трудно определить, для какого типа и для каких элементов генерировать код сериализации.

Очевидно, что можно написать вручную код сериализации, но это скучно, требует времени и также подвержено ошибкам.

Учитывая название функции MyPluginCommand , в этом случае эти теги могут быть использованы для создания кода клея или адаптеров для плагина , но я не могу знать без дополнительной информации.