2012-04-03 6 views
0

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

void QDECL prettyPrintf(int level) { 
    ////// some code. 
} 

Я хотел бы знать, что QDECL.In этого случай, как это возвращение типа QDECL? Что касается моего небольшого знания в C, то «пустота» ничего не возвращает. Итак, это юридическое заявление?

+1

Go найти определение QDECL - он будет расширяться до [вызова конвенции] (http://en.wikipedia.org/wiki/Calling_convention). Не имеет никакого отношения к типу возврата. –

+0

Я никогда не слышал об этом, но, похоже, это псевдоним для __cdecl. –

+0

моя озабоченность заключается в том, что если я переношу вышеуказанный код на Java, нужно ли мне позаботиться об этом? – UVM

ответ

1

Я только что проверил определение QDECL. Это

#define QDECL __cdecl 

Теперь ваша декларация становится

void __cdecl prettyPrintf(int level) 

который еще функция, которая возвращает ничтожным.

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

#define QDECL static 

Теперь ваша функция прототип

void static prettyPrintf(int level) 

который до сих пор void функция, возвращающая

1

QDECL определяет соглашение о вызове. Это макрос, определенный в одном из файлов заголовков, который будет оцениваться примерно так: __cdecl или __stdcall.

Это не влияет на тип возврата функции. Функция по-прежнему является функцией void.

Вы заявляете в комментарии:

Мое беспокойство в том, что если I порт выше код Java, мне нужно заботиться об этом?

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

+0

какое преимущество оно приносит во время выполнения? любое улучшение производительности? Или это стиль кодирования экспертов? – UVM

+0

@UNNI Это не вопрос производительности, или преимуществ, или стиля кодирования. Необходимо определить бинарный контракт между одной библиотекой и другой. Это функция, которая экспортируется в общую библиотеку. Поэтому при вызове функции все стороны должны использовать одни и те же правила.Вызывающая конвенция кодирует эти правила. Почитайте об этом: http://en.wikipedia.org/wiki/Calling_convention –

2

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

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