Bagikan melalui


Makro yang telah ditentukan sebelumnya

Pengkompilasi Microsoft C/C++ (MSVC) telah menentukan makro praprosesor tertentu tergantung pada bahasa (C atau C++), target kompilasi, dan opsi kompilator yang dipilih.

MSVC mendukung makro praprosesor yang telah ditentukan sebelumnya yang diperlukan oleh standar ANSI/ISO C99, C11, dan C17, dan standar ISO C++14, C++17, dan C++20. Implementasi ini juga mendukung beberapa makro praprosesor khusus Microsoft.

Beberapa makro didefinisikan hanya untuk lingkungan build atau opsi kompilator tertentu. Kecuali jika dicatat, makro didefinisikan di seluruh unit terjemahan seolah-olah ditentukan sebagai /D argumen opsi pengkompilasi. Ketika ditentukan, prapemroses memperluas makro nilai yang ditentukan sebelum kompilasi. Makro yang telah ditentukan sebelumnya tidak mengambil argumen dan tidak dapat ditentukan ulang.

Pengidentifikasi standar yang telah ditentukan sebelumnya

Kompiler mendukung pengidentifikasi yang telah ditentukan sebelumnya ini yang ditentukan oleh ISO C99 dan ISO C++11.

  • __func__Nama fungsi enclosing yang tidak memenuhi syarat dan tidak terikat sebagai array const statis lokal fungsi dari char.

    void example()
    {
        printf("%s\n", __func__);
    } // prints "example"
    

Makro standar yang telah ditentukan sebelumnya

Pengkompilasi mendukung makro yang telah ditentukan sebelumnya ini yang ditentukan oleh standar ISO C99, C11, C17, dan ISO C++17.

  • __cplusplus Didefinisikan sebagai nilai literal bilangan bulat saat unit terjemahan dikompilasi sebagai C++. Jika tidak, tidak ditentukan.

  • __DATE__ Tanggal kompilasi file sumber saat ini. Tanggal adalah string panjang konstan harfiah dari formulir Mmm dd yyyy. Nama bulan Mmm sama dengan nama bulan yang disingkat yang dihasilkan oleh fungsi asktime C Runtime Library (CRT). Karakter pertama tanggal dd adalah spasi jika nilainya kurang dari 10. Makro ini selalu ditentukan.

  • __FILE__ Nama file sumber saat ini. __FILE__ meluas ke string karakter secara harfiah. Untuk memastikan bahwa jalur lengkap ke file ditampilkan, gunakan /FC (Jalur Lengkap File Kode Sumber dalam Diagnostik). Makro ini selalu ditentukan.

  • __LINE__ Didefinisikan sebagai nomor baris bilangan bulat dalam file sumber saat ini. Nilai makro ini dapat diubah dengan menggunakan direktif #line . Jenis integral dari nilai __LINE__ dapat bervariasi tergantung pada konteks. Makro ini selalu ditentukan.

  • __STDC__ Didefinisikan sebagai 1 saat dikompilasi sebagai C dan jika /Za opsi pengkompilasi ditentukan. Dimulai di Visual Studio 2022 versi 17.2, itu didefinisikan sebagai 1 saat dikompilasi sebagai C dan jika /std:c11 opsi atau /std:c17 pengkompilasi ditentukan. Jika tidak, tidak ditentukan.

  • __STDC_HOSTED__Didefinisikan sebagai 1 jika implementasi adalah implementasi yang dihosting, yang mendukung seluruh pustaka standar yang diperlukan. Jika tidak, didefinisikan sebagai 0.

  • __STDC_NO_ATOMICS__ Didefinisikan sebagai 1 jika implementasi tidak mendukung atom standar opsional. Implementasi MSVC mendefinisikannya sebagai 1 ketika dikompilasi sebagai C dan salah /std satu opsi C11 atau C17 ditentukan.

  • __STDC_NO_COMPLEX__ Didefinisikan sebagai 1 jika implementasi tidak mendukung angka kompleks standar opsional. Implementasi MSVC mendefinisikannya sebagai 1 ketika dikompilasi sebagai C dan salah /std satu opsi C11 atau C17 ditentukan.

  • __STDC_NO_THREADS__ Didefinisikan sebagai 1 jika implementasi tidak mendukung utas standar opsional. Implementasi MSVC mendefinisikannya sebagai 1 ketika dikompilasi sebagai C dan salah /std satu opsi C11 atau C17 ditentukan.

  • __STDC_NO_VLA__ Didefinisikan sebagai 1 jika implementasi tidak mendukung array panjang variabel standar. Implementasi MSVC mendefinisikannya sebagai 1 ketika dikompilasi sebagai C dan salah /std satu opsi C11 atau C17 ditentukan.

  • __STDC_VERSION__ Didefinisikan saat dikompilasi sebagai C dan salah /std satu opsi C11 atau C17 ditentukan. Ini meluas ke 201112L untuk /std:c11, dan 201710L untuk /std:c17.

  • __STDCPP_DEFAULT_NEW_ALIGNMENT__ Ketika /std:c17 atau lebih baru ditentukan, makro ini meluas ke size_t literal yang memiliki nilai perataan yang dijamin oleh panggilan untuk menyelaraskan-tidak menyadari operator new. Perataan yang lebih besar diteruskan ke kelebihan beban sadar perataan, seperti operator new(std::size_t, std::align_val_t). Untuk informasi selengkapnya, lihat /Zc:alignedNew (Alokasi C++17 yang terlalu selaras).

  • __STDCPP_THREADS__ Didefinisikan sebagai 1 jika dan hanya jika program dapat memiliki lebih dari satu utas eksekusi, dan dikompilasi sebagai C++. Jika tidak, tidak ditentukan.

  • __TIME__ Waktu penerjemahan unit terjemahan yang telah diproscesikan sebelumnya. Waktu adalah string karakter harfiah dari bentuk hh:mm:ss, sama dengan waktu yang dikembalikan oleh fungsi asktime CRT. Makro ini selalu ditentukan.

Makro khusus Microsoft yang telah ditentukan sebelumnya

MSVC mendukung makro lain yang telah ditentukan sebelumnya:

  • __ARM_ARCH Didefinisikan sebagai literal bilangan bulat yang mewakili versi arsitektur ARM. Nilai didefinisikan sebagai 8 untuk arsitektur Armv8-A. Untuk 8.1 dan seterusnya, nilai diskalakan untuk versi minor, seperti X.Y, dengan menggunakan rumus X * 100 + Y seperti yang didefinisikan oleh ekstensi bahasa ARM C. Misalnya, untuk Armv8.1, __ARM_ARCH adalah 8 * 100 + 1 atau 801. Untuk mengatur versi arsitektur ARM, lihat /arch (ARM64). Makro ini diperkenalkan di Visual Studio 2022 versi 17.10.

  • __ATOM__ Didefinisikan sebagai 1 ketika /favor:ATOM opsi pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • __AVX__ Didefinisikan sebagai 1 ketika /arch:AVXopsi , , /arch:AVX2atau /arch:AVX512 pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • __AVX2__ Didefinisikan sebagai 1 ketika /arch:AVX2 opsi atau /arch:AVX512 pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • __AVX512BW__ Didefinisikan sebagai 1 ketika /arch:AVX512 opsi pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • __AVX512CD__ Didefinisikan sebagai 1 ketika /arch:AVX512 opsi pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • __AVX512DQ__ Didefinisikan sebagai 1 ketika /arch:AVX512 opsi pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • __AVX512F__ Didefinisikan sebagai 1 ketika /arch:AVX512 opsi pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • __AVX512VL__ Didefinisikan sebagai 1 ketika /arch:AVX512 opsi pengkompilasi diatur dan target pengkompilasi adalah x86 atau x64. Jika tidak, tidak ditentukan.

  • _CHAR_UNSIGNED Didefinisikan sebagai 1 jika jenis default char tidak ditandatangani. Nilai ini ditentukan ketika /J opsi pengkompilasi (Jenis karakter default tidak ditandatangani) diatur. Jika tidak, tidak ditentukan.

  • __CLR_VER Didefinisikan sebagai bilangan bulat literal yang mewakili versi Common Language Runtime (CLR) yang digunakan untuk mengkompilasi aplikasi. Nilai dikodekan dalam formulir Mmmbbbbb, di mana M adalah versi utama runtime, mm adalah versi minor dari runtime, dan bbbbb merupakan nomor build. __CLR_VER didefinisikan jika /clr opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

    // clr_ver.cpp
    // compile with: /clr
    using namespace System;
    int main() {
       Console::WriteLine(__CLR_VER);
    }
    
  • _CONTROL_FLOW_GUARD Didefinisikan sebagai 1 ketika /guard:cf opsi pengkompilasi (Aktifkan Control Flow Guard) diatur. Jika tidak, tidak ditentukan.

  • __COUNTER__ Memperluas ke literal bilangan bulat yang dimulai pada 0. Nilai bertambah 1 setiap kali digunakan dalam file sumber, atau dalam header yang disertakan dari file sumber. __COUNTER__ mengingat statusnya ketika Anda menggunakan header yang telah dikompresi. Makro ini selalu ditentukan.

    Contoh ini digunakan __COUNTER__ untuk menetapkan pengidentifikasi unik ke tiga objek berbeda dengan jenis yang sama. exampleClass Konstruktor mengambil bilangan bulat sebagai parameter. Dalam main, aplikasi mendeklarasikan tiga objek jenis exampleClass, menggunakan __COUNTER__ sebagai parameter pengidentifikasi unik:

    // macro__COUNTER__.cpp
    // Demonstration of __COUNTER__, assigns unique identifiers to
    // different objects of the same type.
    // Compile by using: cl /EHsc /W4 macro__COUNTER__.cpp
    #include <stdio.h>
    
    class exampleClass {
        int m_nID;
    public:
        // initialize object with a read-only unique ID
        exampleClass(int nID) : m_nID(nID) {}
        int GetID(void) { return m_nID; }
    };
    
    int main()
    {
        // __COUNTER__ is initially defined as 0
        exampleClass e1(__COUNTER__);
    
        // On the second reference, __COUNTER__ is now defined as 1
        exampleClass e2(__COUNTER__);
    
        // __COUNTER__ is now defined as 2
        exampleClass e3(__COUNTER__);
    
        printf("e1 ID: %i\n", e1.GetID());
        printf("e2 ID: %i\n", e2.GetID());
        printf("e3 ID: %i\n", e3.GetID());
    
        // Output
        // ------------------------------
        // e1 ID: 0
        // e2 ID: 1
        // e3 ID: 2
    
        return 0;
    }
    
  • __cplusplus_cli Didefinisikan sebagai nilai literal bilangan bulat 200406 saat dikompilasi sebagai C++ dan /clr opsi pengkompilasi diatur. Jika tidak, tidak ditentukan. Ketika ditentukan, __cplusplus_cli berlaku di seluruh unit terjemahan.

    // cplusplus_cli.cpp
    // compile by using /clr
    #include "stdio.h"
    int main() {
       #ifdef __cplusplus_cli
          printf("%d\n", __cplusplus_cli);
       #else
          printf("not defined\n");
       #endif
    }
    
  • __cplusplus_winrt Didefinisikan sebagai nilai literal bilangan bulat 201009 saat dikompilasi sebagai C++ dan /ZW opsi kompilator (Windows Runtime Compilation) diatur. Jika tidak, tidak ditentukan.

  • _CPPRTTI Didefinisikan sebagai 1 jika /GR opsi kompilator (Aktifkan Informasi Jenis Run-Time) diatur. Jika tidak, tidak ditentukan.

  • _CPPUNWINDDidefinisikan sebagai 1 jika satu atau beberapa /GX opsi kompilasi (Aktifkan Penanganan Pengecualian),/clr(Kompilasi Runtime Bahasa Umum), atau /EH (Model Penanganan Pengecualian) diatur. Jika tidak, tidak ditentukan.

  • _DEBUG Didefinisikan sebagai 1 ketika /LDdopsi , , /MDdatau /MTd kompilator diatur. Jika tidak, tidak ditentukan.

  • _DLL Didefinisikan sebagai 1 ketika /MD opsi pengkompilasi atau /MDd (DLL Multithreaded) diatur. Jika tidak, tidak ditentukan.

  • __FUNCDNAME__ Didefinisikan sebagai string literal yang berisi nama yang didekorasi dari fungsi penutup. Makro didefinisikan hanya dalam fungsi. __FUNCDNAME__ Makro tidak diperluas jika Anda menggunakan /EP opsi atau /P pengkompilasi.

    Contoh ini menggunakan __FUNCDNAME__makro , __FUNCSIG__, dan __FUNCTION__ untuk menampilkan informasi fungsi.

    // Demonstrates functionality of __FUNCTION__, __FUNCDNAME__, and __FUNCSIG__ macros
    void exampleFunction()
    {
        printf("Function name: %s\n", __FUNCTION__);
        printf("Decorated function name: %s\n", __FUNCDNAME__);
        printf("Function signature: %s\n", __FUNCSIG__);
    
        // Sample Output
        // -------------------------------------------------
        // Function name: exampleFunction
        // Decorated function name: ?exampleFunction@@YAXXZ
        // Function signature: void __cdecl exampleFunction(void)
    }
    
  • __FUNCSIG__ Didefinisikan sebagai string literal yang berisi tanda tangan fungsi penutup. Makro didefinisikan hanya dalam fungsi. __FUNCSIG__ Makro tidak diperluas jika Anda menggunakan /EP opsi atau /P pengkompilasi. Saat dikompilasi untuk target 64-bit, konvensi panggilan secara __cdecl default. Untuk contoh penggunaan, lihat __FUNCDNAME__ makro.

  • __FUNCTION__ Didefinisikan sebagai string literal yang berisi nama yang tidak terdekorasi dari fungsi penutup. Makro didefinisikan hanya dalam fungsi. __FUNCTION__ Makro tidak diperluas jika Anda menggunakan /EP opsi atau /P pengkompilasi. Untuk contoh penggunaan, lihat __FUNCDNAME__ makro.

  • _INTEGRAL_MAX_BITS Didefinisikan sebagai nilai literal bilangan bulat 64, ukuran maksimum (dalam bit) untuk jenis integral non-vektor. Makro ini selalu ditentukan.

    // integral_max_bits.cpp
    #include <stdio.h>
    int main() {
        printf("%d\n", _INTEGRAL_MAX_BITS);
    }
    
  • __INTELLISENSE__ Didefinisikan sebagai 1 selama pass kompilator IntelliSense di Visual Studio IDE. Jika tidak, tidak ditentukan. Anda dapat menggunakan makro ini untuk menjaga kode yang tidak dipahami pengkompilasi IntelliSense, atau menggunakannya untuk beralih antara kompiler build dan IntelliSense. Untuk informasi selengkapnya, lihat Tips Pemecahan Masalah untuk IntelliSense Slowness.

  • _ISO_VOLATILE Didefinisikan sebagai 1 jika /volatile:iso opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _KERNEL_MODE Didefinisikan sebagai 1 jika /kernel opsi pengkompilasi (Buat Biner Mode Kernel) diatur. Jika tidak, tidak ditentukan.

  • _M_AMD64 Didefinisikan sebagai nilai literal bilangan bulat 100 untuk kompilasi yang menargetkan prosesor x64 atau ARM64EC. Jika tidak, tidak ditentukan.

  • _M_ARM Didefinisikan sebagai nilai harfiah bilangan bulat 7 untuk kompilasi yang menargetkan prosesor ARM. Tidak ditentukan untuk ARM64, ARM64EC, dan target lainnya.

  • _M_ARM_ARMV7VE Didefinisikan sebagai 1 ketika /arch:ARMv7VE opsi kompilator diatur untuk kompilasi yang menargetkan prosesor ARM. Jika tidak, tidak ditentukan.

  • _M_ARM_FP Didefinisikan sebagai nilai literal bilangan bulat yang menunjukkan opsi pengkompilasi mana yang /arch ditetapkan untuk target prosesor ARM. Jika tidak, tidak ditentukan.

    • Nilai dalam rentang 30-39 jika tidak ada /arch opsi ARM yang ditentukan, menunjukkan arsitektur default untuk ARM diatur (VFPv3).

    • Nilai dalam rentang 40-49 jika /arch:VFPv4 ditetapkan.

    • Untuk informasi selengkapnya, lihat /arch (ARM).

  • _M_ARM64 Didefinisikan sebagai 1 untuk kompilasi yang menargetkan ARM64. Jika tidak, tidak ditentukan.

  • _M_ARM64EC Didefinisikan sebagai 1 untuk kompilasi yang menargetkan ARM64EC. Jika tidak, tidak ditentukan.

  • _M_CEE Didefinisikan sebagai 001 jika ada /clr opsi pengkompilasi (Kompilasi Runtime Bahasa Umum) diatur. Jika tidak, tidak ditentukan.

  • _M_CEE_PURE Tidak digunakan lagi dimulai di Visual Studio 2015. Didefinisikan sebagai 001 jika /clr:pure opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _M_CEE_SAFE Tidak digunakan lagi dimulai di Visual Studio 2015. Didefinisikan sebagai 001 jika /clr:safe opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _M_FP_CONTRACT Tersedia dimulai di Visual Studio 2022. Didefinisikan sebagai 1 jika /fp:contract opsi atau /fp:fast pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _M_FP_EXCEPT Didefinisikan sebagai 1 jika /fp:except opsi atau /fp:strict pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _M_FP_FAST Didefinisikan sebagai 1 jika /fp:fast opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _M_FP_PRECISE Didefinisikan sebagai 1 jika /fp:precise opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _M_FP_STRICT Didefinisikan sebagai 1 jika /fp:strict opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _M_IX86 Didefinisikan sebagai nilai literal bilangan bulat 600 untuk kompilasi yang menargetkan prosesor x86. Makro ini tidak ditentukan untuk target kompilasi x64 atau ARM.

  • _M_IX86_FP Didefinisikan sebagai nilai literal bilangan bulat yang menunjukkan /arch opsi pengkompilasi yang diatur, atau default. Makro ini selalu ditentukan ketika target kompilasi adalah prosesor x86. Jika tidak, tidak ditentukan. Ketika ditentukan, nilainya adalah:

    • 0 jika /arch:IA32 opsi pengkompilasi diatur.

    • 1 jika /arch:SSE opsi pengkompilasi diatur.

    • 2 jika /arch:SSE2opsi , /arch:AVX, /arch:AVX2, atau /arch:AVX512 kompilator diatur. Nilai ini adalah default jika /arch opsi pengkompilasi tidak ditentukan. Ketika /arch:AVX ditentukan, makro __AVX__ juga ditentukan. Ketika /arch:AVX2 ditentukan, dan __AVX____AVX2__ juga didefinisikan. Ketika /arch:AVX512 ditentukan, __AVX__, , __AVX2__, __AVX512BW__, __AVX512CD__, __AVX512DQ____AVX512F__, dan __AVX512VL__ juga ditentukan.

    • Untuk informasi selengkapnya, lihat /arch (x86).

  • _M_X64 Didefinisikan sebagai nilai literal bilangan bulat 100 untuk kompilasi yang menargetkan prosesor x64 atau ARM64EC. Jika tidak, tidak ditentukan.

  • _MANAGED Didefinisikan sebagai 1 saat /clr opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _MSC_BUILD Didefinisikan sebagai bilangan bulat literal yang berisi elemen nomor revisi dari nomor versi pengkompilasi. Nomor revisi adalah elemen terakhir dari nomor versi yang dibatasi periode. Misalnya, jika nomor versi pengkompilasi Microsoft C/C++ adalah 15.00.20706.01, _MSC_BUILD makro adalah 1. Makro ini selalu ditentukan.

  • _MSC_EXTENSIONS Didefinisikan sebagai 1 jika opsi kompilator on-by-default /Ze (Aktifkan Ekstensi Bahasa) diatur. Jika tidak, tidak ditentukan.

  • _MSC_FULL_VER Didefinisikan sebagai bilangan bulat literal yang mengodekan elemen angka utama, minor, dan build dari nomor versi kompilator. Angka utama adalah elemen pertama dari nomor versi yang dibatasi periode, angka minor adalah elemen kedua, dan nomor build adalah elemen ketiga.

    Misalnya, jika versi kompilator Microsoft C/C++ adalah 19.39.33519, _MSC_FULL_VER 193933519. Masukkan cl /? di baris perintah untuk melihat nomor versi pengkompilasi. Makro ini selalu ditentukan. Untuk informasi selengkapnya tentang penerapan versi kompilator, lihat Penerapan versi kompilator C++ dan khususnya Rilis layanan yang dimulai dengan Visual Studio 2017 untuk informasi selengkapnya tentang Visual Studio 2019 16.8, 16.9, 16.10 dan 16.11, yang mengharuskan _MSC_FULL_VER untuk membedakannya.

  • _MSC_VER Didefinisikan sebagai bilangan bulat literal yang mengodekan elemen angka utama dan minor dari nomor versi kompilator. Angka utama adalah elemen pertama dari nomor versi yang dibatasi periode dan angka minor adalah elemen kedua. Misalnya, jika nomor versi pengkompilasi Microsoft C/C++ adalah 17.00.51106.1, nilainya _MSC_VER adalah 1700. Masukkan cl /? di baris perintah untuk melihat nomor versi pengkompilasi. Makro ini selalu ditentukan.

    Untuk menguji rilis kompilator atau pembaruan dalam versi Visual Studio tertentu atau yang lebih baru, gunakan >= operator . Anda dapat menggunakannya dalam arahan kondisional untuk dibandingkan dengan _MSC_VER versi yang diketahui. Jika Anda memiliki beberapa versi yang saling eksklusif untuk dibandingkan, pesan perbandingan Anda dalam urutan menurun nomor versi. Misalnya, kode ini memeriksa kompilator yang dirilis di Visual Studio 2017 dan yang lebih baru. Selanjutnya, ini memeriksa kompilator yang dirilis di atau setelah Visual Studio 2015. Kemudian memeriksa semua kompilator yang dirilis sebelum Visual Studio 2015:

    #if _MSC_VER >= 1910
    // . . .
    #elif _MSC_VER >= 1900
    // . . .
    #else
    // . . .
    #endif
    

    Untuk informasi selengkapnya tentang Visual Studio 2019 16.8 dan 16.9, dan 16.10 dan 16.11, yang memiliki versi utama dan minor yang sama (sehingga memiliki nilai yang sama untuk _MSC_VER), lihat Rilis layanan yang dimulai dengan Visual Studio 2017.

    Untuk informasi selengkapnya tentang riwayat penerapan versi kompilator, dan nomor versi pengkompilasi dan versi Visual Studio yang sesuai dengannya, lihat penerapan versi kompilator C++. Selain itu, Visual C++ Compiler Version di blog tim Microsoft C++.

  • _MSVC_LANG Didefinisikan sebagai literal bilangan bulat yang menentukan standar bahasa C++ yang ditargetkan oleh pengkompilasi. Hanya kode yang dikompilasi sebagai C++ yang mengaturnya. Makro adalah nilai 201402L literal bilangan bulat secara default, atau ketika /std:c++14 opsi pengkompilasi ditentukan. Makro diatur ke 201703L jika /std:c++17 opsi pengkompilasi ditentukan. Makro diatur ke 202002L jika /std:c++20 opsi pengkompilasi ditentukan. Ini diatur ke nilai yang lebih tinggi dan tidak ditentukan saat /std:c++latest opsi ditentukan. Jika tidak, makro tidak ditentukan. Opsi _MSVC_LANG pengkompilasi makro dan /std (Tentukan versi standar bahasa) tersedia dimulai di Visual Studio 2015 Update 3.

  • __MSVC_RUNTIME_CHECKS Didefinisikan sebagai 1 ketika salah /RTC satu opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _MSVC_TRADITIONAL:

    • Tersedia dimulai dengan Visual Studio 2017 versi 15.8: Didefinisikan sebagai 0 saat opsi kompilator mode /experimental:preprocessor kesuaian praproscesor diatur. Didefinisikan sebagai 1 secara default, atau ketika /experimental:preprocessor- opsi pengkompilasi diatur, untuk menunjukkan prapemrosana tradisional sedang digunakan.
    • Tersedia dimulai dengan Visual Studio 2019 versi 16.5: Didefinisikan sebagai 0 saat opsi kompilator mode /Zc:preprocessor kesuaian praproscesor diatur. Didefinisikan sebagai 1 secara default, atau ketika /Zc:preprocessor- opsi pengkompilasi diatur, untuk menunjukkan prapemrosem tradisional sedang digunakan (pada dasarnya, /Zc:preprocessor menggantikan yang tidak digunakan /experimental:preprocessorlagi ).
    #if !defined(_MSVC_TRADITIONAL) || _MSVC_TRADITIONAL
    // Logic using the traditional preprocessor
    #else
    // Logic using cross-platform compatible preprocessor
    #endif
    
  • _MTDidefinisikan sebagai 1 ketika /MD atau /MDd (DLL Multithreaded) atau /MTd/MT (Multithreaded) ditentukan. Jika tidak, tidak ditentukan.

  • _NATIVE_WCHAR_T_DEFINED Didefinisikan sebagai 1 saat /Zc:wchar_t opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • _OPENMP Didefinisikan sebagai 200203 literal bilangan bulat, jika /openmp opsi pengkompilasi (Aktifkan Dukungan OpenMP 2.0) diatur. Nilai ini menunjukkan tanggal spesifikasi OpenMP yang diterapkan oleh MSVC. Jika tidak, tidak ditentukan.

    // _OPENMP_dir.cpp
    // compile with: /openmp
    #include <stdio.h>
    int main() {
        printf("%d\n", _OPENMP);
    }
    
  • _PREFAST_ Didefinisikan sebagai 1 saat /analyze opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • __SANITIZE_ADDRESS__ Tersedia dimulai dengan Visual Studio 2019 versi 16.9. Didefinisikan sebagai 1 saat /fsanitize=address opsi pengkompilasi diatur. Jika tidak, tidak ditentukan.

  • __TIMESTAMP__ Didefinisikan sebagai string literal yang berisi tanggal dan waktu modifikasi terakhir file sumber saat ini, dalam bentuk panjang konstanta singkatan yang dikembalikan oleh fungsi CRT asctime , misalnya, Fri 19 Aug 13:32:58 2016. Makro ini selalu ditentukan.

  • _VC_NODEFAULTLIB Didefinisikan sebagai 1 ketika /Zl opsi pengkompilasi (Hilangkan Nama Pustaka Default) diatur. Jika tidak, tidak ditentukan.

  • _WCHAR_T_DEFINED Didefinisikan sebagai 1 ketika opsi kompilator default /Zc:wchar_t diatur. _WCHAR_T_DEFINED Makro didefinisikan tetapi tidak memiliki nilai jika /Zc:wchar_t- opsi pengkompilasi diatur, dan wchar_t didefinisikan dalam file header sistem yang disertakan dalam proyek Anda. Jika tidak, tidak ditentukan.

  • _WIN32 Didefinisikan sebagai 1 ketika target kompilasi adalah ARM 32-bit, ARM 64-bit, x86, atau x64. Jika tidak, tidak ditentukan.

  • _WIN64 Didefinisikan sebagai 1 ketika target kompilasi adalah ARM 64-bit atau x64. Jika tidak, tidak ditentukan.

  • _WINRT_DLL Didefinisikan sebagai 1 ketika dikompilasi sebagai C++ dan keduanya /ZW (Windows Runtime Compilation) dan /LD atau /LDd opsi kompilator diatur. Jika tidak, tidak ditentukan.

Tidak ada makro praprosesor yang mengidentifikasi versi pustaka ATL atau MFC yang telah ditentukan sebelumnya oleh pengkompilasi. Header pustaka ATL dan MFC menentukan makro versi ini secara internal. Mereka tidak terdefinisi dalam arahan prapemroseduran yang dibuat sebelum header yang diperlukan disertakan.

  • _ATL_VER Didefinisikan <atldef.h> sebagai bilangan bulat literal yang mengodekan nomor versi ATL.

  • _MFC_VER Didefinisikan <afxver_.h> sebagai bilangan bulat literal yang mengodekan nomor versi MFC.

Lihat juga

Makro (C/C++)
Operator prapemroscesor
Arahan pra-prosesor