Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Słowo __based
kluczowe umożliwia deklarowanie wskaźników na podstawie wskaźników (wskaźników, które są przesunięciami z istniejących wskaźników). Słowo __based
kluczowe jest specyficzne dla firmy Microsoft.
Składnia
type __based( base ) declarator
Uwagi
Wskaźniki oparte na adresach wskaźników są jedyną formą słowa kluczowego prawidłowego __based
w kompilacjach 32-bitowych lub 64-bitowych. W przypadku kompilatora microsoft 32-bitowego języka C/C++ wskaźnik oparty jest 32-bitowym przesunięciem z 32-bitowej bazy wskaźnika. Podobne ograniczenie dotyczy środowisk 64-bitowych, w których wskaźnik oparty jest 64-bitowym przesunięciem z 64-bitowej bazy.
Jednym z nich jest użycie wskaźników opartych na wskaźnikach w przypadku identyfikatorów trwałych zawierających wskaźniki. Połączona lista składająca się ze wskaźników opartych na wskaźniku może zostać zapisana na dysku, a następnie ponownie załadowana do innego miejsca w pamięci, a wskaźniki pozostają prawidłowe. Na przykład:
// based_pointers1.cpp
// compile with: /c
void *vpBuffer;
struct llist_t {
void __based( vpBuffer ) *vpData;
struct llist_t __based( vpBuffer ) *llNext;
};
Wskaźnik vpBuffer
jest przypisywany adres pamięci przydzielonej w pewnym późniejszym momencie w programie. Połączona lista jest przenoszona względem wartości vpBuffer
.
Uwaga
Utrwalanie identyfikatorów zawierających wskaźniki można również osiągnąć za pomocą plików mapowanych w pamięci.
W przypadku wyłuskania wskaźnika opartego baza musi być jawnie określona lub niejawnie znana za pomocą deklaracji.
Aby uzyskać zgodność z poprzednimi wersjami, _based jest synonimem, __based
chyba że określono opcję kompilatora /Za (Wyłącz rozszerzenia języka).
Przykład
Poniższy kod demonstruje zmianę wskaźnika opartego na zmianie podstawy.
// based_pointers2.cpp
// compile with: /EHsc
#include <iostream>
int a1[] = { 1,2,3 };
int a2[] = { 10,11,12 };
int *pBased;
typedef int __based(pBased) * pBasedPtr;
using namespace std;
int main() {
pBased = &a1[0];
pBasedPtr pb = 0;
cout << *pb << endl;
cout << *(pb+1) << endl;
pBased = &a2[0];
cout << *pb << endl;
cout << *(pb+1) << endl;
}
1
2
10
11