2011-09-19 1 views
4

Я работаю с исходной базой с неясным для меня решение по определению типов указателей: с помощью _ PTR _ макрос вместо *. Таким образом, все прототипы функций и определение типов выглядят следующим образом:Что такое логика _PTR_?

extern FILE_PTR _io_fopen(const char _PTR_, const char _PTR_); 

Интересно, что может быть Обоснованием этого, так как для меня это кажется чрезмерным.

EDIT

Кстати, для двойной косвенности я нашел:

_io_strtod(char _PTR_, char _PTR_ _PTR_); 
+1

Хороший вопрос. Мне действительно интересно узнать, есть ли у кого-то хороший ответ на этот вопрос. Вы видите '__PTR__ __PTR__' для двойного обращения? : S –

+3

lol ... может быть, программист, который придумал это, имел проблемы со зрением и трудности в распознавании маленьких звездочек в середине всех остальных символов, присутствующих в типичном исходном файле. – pmg

+0

@ Майкл Миор Ха-ха - есть :) – pmod

ответ

6

Вполне возможно, что определение для совместимости с DOS.

#ifdef DOS 
#define _PTR_ far * 
#else 
#define _PTR_ * 
#endif 

В far/near ключевые слова позволяют указатели на адрес памяти внутри/вне текущего сегмента, что позволяет программам работать более чем 64 KiB памяти в то же время сохраняя преимущества 16 разрядных указателей для более быстрого кода/меньше использования памяти ,

Более типично исключить из определения *. Например, в Libpng, вы можете увидеть такие определения, как:

typedef png_color FAR * png_colorp; 
typedef png_color FAR * FAR * png_colorpp; 

На большинстве платформ FAR будет #defined ни к чему.

Хотя DOS давно прошло, некоторые современные встроенные архитектуры имеют схожие проблемы. Для процессоров архитектуры Harvard, указатели на программу и память данных должны быть доступны с использованием разных инструкций, поэтому они имеют разные типы. Другие процессоры имеют разные «модели данных», и нет ничего необычного в том, чтобы видеть специальные типы указателей для указателей ниже 2^24, 2^16 или 2^8.

+0

Ну, может быть, однако я вижу, что это это #define _PTR_ * и в части кода, связанного с конкретной платформой (код не предназначен для построения под DOS, на самом деле это находится внутри RTOS). Таким образом, вероятно, они хотели сохранить код переносимым для будущего (га = га) ... – pmod

+0

@pmod: Многие встроенные архитектуры имеют разные типы указателей, так же как и DOS, чтобы это можно было объяснить. –

+0

Я не думаю, что этот ответ имеет смысл. Если вы хотите, чтобы ВСЕ указатели были в DOS, вы использовали бы большую/огромную модель памяти. Если вы хотите, чтобы указатели SOME были далеко, то вызов макроса '_PTR_' не имеет смысла ... –

0

Это хорошее соглашение легко (при достаточно малых определений легко) различия между умножением и косвенностью

int _PTR_ arr = malloc(42 * sizeof _PTR_ arr); 
+2

Eh, 'int * arr' не выглядит как умножение; D – Griwes

+0

Не существует, @Griwes: в аргументе malloc! Также '42 ** arr' ==' 42 * _PTR_ arr' == '42 * arr [0]' – pmg

+0

Вот почему я всегда добавляю пробелы в правильные места ... '42 * (* arr)' или '42 * * arr' является более четким и не содержит некоторого нечитаемого и верхнего (макро) макроса. И с 'sizeof', просто используйте' 42 * sizeof (* arr) ', если вам нужно такое выражение ... – Griwes

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

  • Нет связанных вопросов^_^