Использование модификаторов типа (ближний, дальний, огромный) с обычными переменными

Я использовал модификаторы типа (far,near,huge) с обычными переменными, а не с указателями, и обнаружил, что эти модификаторы типа указателя применимы только для глобальной нормальной переменной, но при использовании с локальной переменной генерируется ошибка. к блоку.

int near a,far b,huge c;

int main()
{
 int d,e,f;

// int near a,far b,,huge c;
// long int near a,far b,huge c;
// long long int near a,far b,huge c;

//printf("\n size of a=%d ,b=%d ,c=%d ,d=%d ,e=%d ,f=%d",sizeof(a),sizeof(b),sizeof(c),sizeof(d),sizeof(e),sizeof(f));

printf("\n address of a=%u ,b=%u ,c=%u ,d=%u ,e=%u,f=%u",&a,&b,&c,&d,&e,&f);
  return 0;
  }

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


person NeoR    schedule 27.10.2015    source источник


Ответы (2)


near, far и huge влияют на то, где и в каком типе памяти хранится переменная. Поскольку локальные переменные всегда хранятся в стеке, использование этих модификаторов для локальных переменных не имеет никакого смысла.

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

person Community    schedule 27.10.2016
comment
я понимаю, что их можно игнорировать, но это было сделано исключительно в исследовательских целях (написание TSR в 16-битной DOS: D). Я даже не смог ничего найти в документации gcc. - person NeoR; 27.10.2016
comment
Кроме того, эти модификаторы типа использовались для доступа к данным внутри сегмента данных или кода путем увеличения размера переменной-указателя. - person NeoR; 27.10.2016
comment
@NeoR никогда не было версии GCC для реального режима DOS. Проект DJGPP работает в 32-битном защищенном режиме. - person M.M; 27.10.2016
comment
@MM, спасибо, не знал, что код на самом деле написан на 16-битном Turbo-C, но в наши дни трудно найти руководства по Turbo-C, хотя мне удалось заполучить цифровую копию официального IBM Turbo-c. Руководство по-прежнему не могло прийти к каким-либо выводам. - person NeoR; 27.10.2016
comment
У меня была (очень слабо сформулированная) идея относительно автоматических сборщиков мусора, и, поскольку локальные переменные обычно основаны на смещении EBP, я подумал, что вместо этого может быть полезно получить адрес data-segment/far. дерьмо с какими-то дважды связанными списками с фактическими объектами, выделенными в куче - например ... простыми проверками вне области действия текущего кадра стека. Я думаю, это бюст... :/ - person Christoffer Bubach; 28.06.2020

Все, что находится в стеке, не может быть сильно изменено.

Вы можете поместить в стек «недальние переменные», но не «дальние переменные».

Вы можете поместить в стек «недальние указатели на недальние данные», но не «дальние указатели на недальние данные». далекие данные**".

Вы можете поместить в стек «дальние указатели на дальние данные», но не «дальние указатели на дальние данные». > данные».

Попробуй это:

far int       var        = 0; /* OK */
far int far* far_var_ptr = &var; /* OK: far pointer to far data*/ 
int far*     var_ptr     = &var; /* OK: non-far pointer to far data*/ */

int main()
{
int far*      var_ptr2    = &var; /* OK: Non-far ptr to far data */
far int far* far_var_ptr2 = &var; /* Fail: far ptr to far data */ 
far int       var2         = 0;     /* Fail: far data */
}

Суть в том, что вы не можете определить дальние данные в стеке. Переменные в стеке:

Помещается в определенный диапазон памяти

Его точное местоположение зависит от стека вызовов ранее: его нельзя узнать во время компиляции.

Это не дальние данные:

int far* var;

Это немодифицированный указатель на дальние данные. Сам указатель - это просто число, не сильно измененное, которое указывает на данные в дальнем сегменте (зависит от платформы).

Это дальние данные:

far int* var;

И это тоже:

far int far* var;

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

person NeoR    schedule 28.10.2016