Compiler Warning (level 1) C5105
ekspansi makro yang menghasilkan 'didefinisikan' memiliki perilaku yang tidak ditentukan
Keterangan
Prapemroses mendeteksi defined
operator dalam output ekspansi makro. defined
Jika operator muncul sebagai hasil dari ekspansi makro, standar C menentukan perilaku sebagai tidak terdefinisi. Peringatan C5105 adalah peringatan kesesuaian portabilitas dan standar, yang dikeluarkan karena kompilator sesuai lainnya mungkin memiliki perilaku yang berbeda. Untuk mengatasi masalah ini, pindahkan defined
operator keluar dari makro, atau tekan C5105 peringatan.
Perilaku khusus Microsoft: Pengkompilasi MSVC mengevaluasi defined
operator secara normal, bahkan di bawah /permissive-
.
Peringatan ini baru di Visual Studio 2017 versi 15.8. Ini hanya dihasilkan oleh preprosedor sesuai standar baru, yang ditentukan oleh /experimental:preprocessor
opsi kompilator.
Untuk menonaktifkan peringatan tanpa perubahan kode
Anda dapat menonaktifkan peringatan untuk baris kode tertentu dengan menggunakan pragma peringatan , #pragma warning(suppress : 5105)
. Anda juga dapat menonaktifkan peringatan dalam file dengan menggunakan pragma peringatan, #pragma warning(disable : 5105)
. Anda dapat menonaktifkan peringatan secara global dalam build baris perintah dengan menggunakan opsi baris perintah /wd5105 .
Untuk menonaktifkan peringatan untuk seluruh proyek di IDE Visual Studio:
- Buka dialog Halaman Properti untuk proyek Anda. Untuk informasi tentang cara menggunakan dialog Halaman Properti, lihat Halaman Properti.
- Pilih halaman Properti>Konfigurasi C/C++>Tingkat Lanjut.
- Edit properti Nonaktifkan Peringatan Tertentu untuk menambahkan
5105
. Pilih OK untuk menerapkan perubahan Anda.
Contoh
Program sampel ini menunjukkan cara menghasilkan peringatan C5105, dan cara memperbaikinya.
// C5105.cpp
// To demonstrate the warning,
// compile by using: cl /EHsc /experimental:preprocessor /DTEST C5105.cpp
// To fix the warning, change the DEFINED_TEST
// definition to the commented version.
#include <iostream>
#define DEFINED_TEST defined TEST
//#if defined TEST
//#define DEFINED_TEST 1
//#else
//#define DEFINED_TEST 0
//#endif
int main()
{
#if DEFINED_TEST // C5105
std::cout << "TEST defined\n";
#else
std::cout << "TEST not defined\n";
#endif
}