Aracılığıyla paylaş


64 Bit Derleyici

32 bit sürücü kaynak kodunuzu yeni veri türlerini kullanacak şekilde dönüştürdükten sonra, başlangıçta kaçırdığınız türle ilgili sorunları belirlemek için 64 bit derleyicisini kullanabilirsiniz. Bu kodu 64 bit Windows için ilk kez derlediğinizde, derleyici birçok işaretçi kesme veya tür uyuşmazlığı uyarısı oluşturabilir. Kodunuzu daha sağlam hale getirmek için bu uyarıları kılavuz olarak kullanın. Tüm uyarıları, özellikle işaretçi kesme uyarılarını ortadan kaldırmak iyi bir uygulamadır.

Aşağıda bu tür bir uyarı örneği verilmiştir:

warning C4311: 'type cast' : pointer truncation from 'unsigned char *' to 'unsigned long '

Örneğin, aşağıdaki kod C4311 uyarısını oluşturabilir:

buffer = (PUCHAR)srbControl;
(ULONG)buffer += srbControl->HeaderLength;

Kodu düzeltmek için aşağıdaki değişiklikleri yapın:

buffer = (PUCHAR)srbControl;
(ULONG_PTR)buffer += srbControl->HeaderLength;

Önceden tanımlanmış makrolar

Derleyici, platformu tanımlamak için aşağıdaki makroları tanımlar.

Makro Anlamı

_WIN64

64-bitlik bir platform.

_WIN32

32 bit platform. Bu değer, geriye dönük uyumluluk için 64 bit derleyici tarafından da tanımlanır.

_WIN16

16 bit platform.

Aşağıdaki makrolar mimariye özeldir.

Makro Anlamı

_M_IA64

64 bit Intel platformu.

_M_IX86

32 bit Intel platformu.

Mimariye özgü kod dışında bu makroları kullanmayın. Bunun yerine mümkün olduğunca _WIN64, _WIN32 ve _WIN16 kullanın.

64 Bit derleyici anahtarları ve uyarıları

64 bit Windows'a taşımaya yardımcı olacak bir uyarı seçeneği vardır. -Wp64-W3 anahtarı aşağıdaki uyarıları etkinleştirir:

  • C4305: Kesme uyarısı. Örneğin, "return": "unsigned int64" değerinin "long" kadar kesilmesi.

  • C4311: Kesilme uyarısı. Örneğin, "tür dönüşümü": "int*_ptr64" işaretçisinin "int" olarak kısaltılması.

  • C4312: Daha büyük boyutlu uyarıya dönüştürme. Örneğin, "tür dönüştürme": "int" tipini daha büyük boyutlu "int*_ptr64" tipine dönüştürme.

  • C4318: Sıfır uzunluk geçirilmektedir. Örneğin, memset işlevine uzunluk olarak sıfır sabitini geçirme.

  • C4319: Değil operatörü. Örneğin, "~": "unsigned long" öğesini daha büyük boyuttaki "işaretsiz _int64" değerine genişleten sıfır.

  • C4313: Çakışan dönüştürme türü tanımlayıcıları ve bağımsız değişkenleriyle printf işlev ailesini çağırma. Örneğin, "printf": "%p" biçim dizesinde "_int64" türündeki ikinci bağımsız değişkenle çatışır. Bir diğer örnek ise printf("%x", pointer_value); bu durum üst 32 bitin kesilmesine neden olur. Doğru çağrı printf("%p", pointer_value).

  • C4244: Mevcut uyarı C4242 ile aynıdır. Örneğin, "return": "_int64" türünden "unsigned int" türüne dönüşüm, olası veri kaybı.