Pertanyaan std :: min memberi kesalahan


#include <algorithm>
#include <Windows.h>

int main()
{
    int k = std::min(3, 4);
    return 0;
}

Apa yang dilakukan windows, jika saya menyertakan Windows.h Saya tidak dapat menggunakan std :: min di visual studio 2005. Pesan kesalahannya adalah:

error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'

75
2018-02-15 14:26


asal


Jawaban:


Itu windows.h file header (atau lebih tepatnya, windef.h bahwa itu termasuk pada gilirannya) memiliki makro untuk min dan max yang mengganggu.

Kamu harus #define NOMINMAX sebelum memasukkannya.


115
2018-02-15 14:28



Tidak perlu mendefinisikan apa pun, cukup bypass makro menggunakan sintaks ini:

(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);

66
2018-02-25 18:34



Seperti yang disebutkan orang lain, kesalahan ini disebabkan oleh makro min / max yang didefinisikan di header windows (s). Ada tiga cara untuk menonaktifkannya.

1) #define NOMINMAX sebelum menyertakan header, ini umumnya merupakan teknik yang buruk dalam mendefinisikan makro untuk memengaruhi header berikut;

2) definisikan NOMINMAX di baris perintah kompilator / IDE. Bagian buruk tentang keputusan ini adalah bahwa jika Anda ingin mengirimkan sumber Anda, Anda perlu memperingatkan pengguna untuk melakukan hal yang sama;

3) cukup undefinasikan makro di kode Anda sebelum digunakan

#undef min
#undef max

Ini mungkin solusi yang paling portabel dan fleksibel.


22
2018-02-15 14:56



Coba sesuatu seperti ini:

#define NOMINMAX
#include <windows.h>

Secara default, windows.h mendefinisikan min dan max sebagai makro. Ketika itu diperluas, kode yang mencoba untuk digunakan std::min (misalnya) akan berakhir dengan mencari sesuatu seperti ini:

int k = std::(x) < (y) ? (x) : (y);

Pesan kesalahan memberi tahu Anda itu std::(x) tidak diizinkan.


11
2018-02-15 14:29



Saya masih memiliki masalah kadang-kadang dengan header windows dan proyek luas mendefinisikan NOMINMAX tidak selalu berfungsi. Sebagai alternatif untuk menggunakan tanda kurung, saya terkadang membuat jenis itu seperti itu:

int k = std::min<int>(3, 4);

Ini juga menghentikan preprocessor dari pencocokan ke min dan bisa dibilang lebih mudah dibaca daripada solusi tanda kurung.


10
2018-06-18 20:06



Dalam kasus saya, proyek tidak termasuk windows.h atau windef.h secara eksplisit. Itu menggunakan Boost. Jadi, saya menyelesaikan masalah dengan pergi ke proyek Properties -> C/C++ -> Preprocessor, dan menambahkan NOMINMAX dalam Preprocessor Definitions (VS 2013, VS 2015).


3
2017-11-22 19:00



#define NOMINMAX

adalah trik untuk menekan definisi makro dari max dan min

http://support.microsoft.com/kb/143208


2
2018-02-15 14:30



Untuk orang-orang termasuk windows.h, letakkan yang berikut di header yang terpengaruh:

#include windows headers ...

pragma push_macro("min")
pragma push_macro("max")
#undef min
#undef max

#include headers expecting std::min/std::max ...

...

pragma pop_macro("min")
pragma pop_macro("max")

Dalam file sumber hanya #undef min dan maks.

#include windows headers ...

#undef min
#undef max

#include headers expecting std::min/std::max ...

2
2017-10-02 19:18



Saya berasumsi windows.h tidak mendefinisikan min sebagai makro, mis. seperti

#define min(a,b)  ((a < b) ? a : b)

Itu akan menjelaskan pesan kesalahan.


1
2018-02-15 14:29



Untuk mengatasi masalah ini saya hanya membuat file header bernama fix_minmax.h  tanpa termasuk penjaga

#ifdef max
    #undef max
#endif

#ifdef min
    #undef min
#endif

#ifdef MAX
    #undef MAX
#endif
#define MAX max

#ifdef MIN
   #undef MIN
#endif
#define MIN min

#include <algorithm>
using std::max;
using std::min;

Penggunaan dasar seperti ini.

// Annoying third party header with min/max macros
#include "microsoft-mega-api.h"
#include "fix_minmax.h"

Kelebihan dari pendekatan ini adalah bahwa ia bekerja dengan setiap jenis file yang dimasukkan atau bagian dari kode. Ini juga menghemat waktu Anda ketika berhadapan dengan kode atau pustaka yang bergantung padanya min/max makro


-1
2018-06-13 20:28