2016-08-31 3 views
0

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

void DESC_API ApplDesc(DescMsg* pMsg)

Я могу видеть, что функция разве возвращение ничего так void держит хорошо. Но что здесь делает DESC_API? Это, как он определен в заголовочном файле

#if defined(DESC_API) 
#else 
/* No paging used. */ 
#define DESC_API 
#endif 
+0

Что-то в сборке, вероятно, будет определять DESC_API в командной строке компилятора. –

+0

Это, вероятно, ничего не делает. Я думаю, что это может быть крючок для чего-то (как описано в ответах ниже), который либо никогда не был реализован, либо был инъецирован во время компиляции. Вы пробовали сообщить своему компилятору сделать только часть предварительной обработки (например, «gcc -E»), чтобы понять, что это значит? Возможно, это даст вам больше информации о том, что происходит. – user5728855

ответ

3

Похоже, что DESC_API a - макрос видимости. Он может быть определен как __declspec(dllexport) или до __declspec(dllimport) для MSVC или до __attribute__ ((visibility ("default"))) для gcc или clang.

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

Поскольку gcc и clang экспортируют все символы по умолчанию, атрибуты не требуются, а DESC_API пуст. Что касается MSVC, ваша система сборки может установить ее через /DDESC_API=__declspec(dllimport) извне.

0

Ну, наверное, ничего не делает, как вы можете видеть на макрокоманду DESC_API заменяется пустым, следовательно, это, вероятно, макрос используется для удобства читаемости это все, хотя

+4

Осторожно. Представленный код определяет 'DESC_API' как ничто, только если оно еще не определено. –

1

Похоже, что DESC_API может использоваться для переключения между функцией, возвращающей ничего, и функцией, возвращающей void*.

Если определить

#define DESC_API * 

функция будет возвращать указатель недействительным; иначе функция ничего не вернет.

Конечно, остальная часть функции должна выполняться с условным возвратом на основании значения DESC_API.

+1

Может быть, но OP отмечает, что функция ничего не возвращает. Возможно, он не упомянул об условных директивах компиляции, влияющих на это, но я думаю, что более вероятно, что предполагаемое использование макроса немного отличается. –

1

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

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

Смежные вопросы