_ сегмент не определен при переходе с VC6 на VS2019

#visual-studio #visual-c #compiler-errors

Вопрос:

Я переношу проект Windows с VC6 на VS2019, но получаю сообщение об ошибке:

Идентификатор E0020 «_segment» не определен

Я пытаюсь найти определение _segment, но безуспешно. Итак, мне интересно, возможно ли, что _segment-это ключевое слово в VC6. Однако я все еще ничего не нахожу в Google.

Есть идеи, как исправить ошибку? Спасибо.

Код таков:

 #ifndef _MSC_Ver
#define _MSC_Ver
#endif

/* MS-C  ?? */
#ifdef  _MSC_VER
_segment SegDefine,SegType,SegSym,SegCode;
#endif

#define ALLOC_C
#include "common.h"
#include <malloc.h>
#include "extern.h"

#ifdef  MSDOS
#include <dos.h>
#ifndef __WATCOMC__
#include <memory.h>
#endif
#endif

/* MM(????)?    */
#define MaxClass    8

#ifdef  _MSC_VER    /* MS-C  ?? */

/* FARBased ? */
static USHORT       mmFarSeg[MaxClass];         /* ??         */
static USHORT       mmFarBase[MaxClass];        /*          */
static USHORT       mmFarOrg[MaxClass];         /* ??        */
static USHORT       mmFarSize[MaxClass];        /*          */
 

Ответ №1:

_segment было ключевым словом в 16-разрядных MSC 6 и VC 1.x (не VC 6), связанным с сегментацией памяти x86 и _based указателями. Ключевое слово было удалено в 32-разрядных версиях VC, начиная с VC 2.0. Из Microsoft Q67882:

Следующие ключевые слова были впервые введены в Microsoft C версии 6.0:

_based

_segment

[…]

ПРИМЕЧАНИЕ. В 32-разрядной версии Microsoft Visual C версии 2.0 _segment ключевое слово было удалено, а функциональность __based ключевого слова изменена.

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

1. Есть ли соответствующее ему ключевое слово в VS2019? Если нет, то чем я могу заменить _segment? Спасибо!

2. @David Нет соответствующего ключевого слова, потому что в моделях плоской памяти, используемых в 32 — и 64-разрядных версиях, больше нет » сегментов «, о которых можно было бы говорить в настоящее время. VC по-прежнему поддерживает указатели на основе , хотя они имеют довольно специализированное применение. Имеет ли смысл полностью переписать или вообще отказаться от 16-битного кода, в котором использовалась _segment адресация, невозможно ответить, не понимая полностью, что делал старый код в первую очередь.