উইন্ডোজ এইড অন্তর্ভুক্ত করার সময় কেন স্ট্যান্ড :: মিনিট ব্যর্থ হয়?


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

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

আমি উইন্ডোজ এইচকে অন্তর্ভুক্ত করলে উইন্ডোজগুলি কী করছে? আমি std::minভিজ্যুয়াল স্টুডিও 2005 এ ব্যবহার করতে পারি না The ত্রুটি বার্তাটি হ'ল:

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

এর প্রতিলিপি stackoverflow.com/questions/1394132/...
SirDarius

উত্তর:


156

windows.hহেডার ফাইল (বা তার বেশি সঠিকভাবে windef.hএটি পালাক্রমে অন্তর্ভুক্ত) জন্য ম্যাক্রো হয়েছে minএবং maxযা হস্তক্ষেপ করছে।

আপনি #define NOMINMAXএটি আগে অন্তর্ভুক্ত করা উচিত ।


27
ম্যাক্রোস দুষ্ট হওয়ার অন্যতম কারণ। : ডি
নওয়াজ

7
আমি একটি প্রজেক্ট-ওয়াইড / ডি "নোমিনম্যাক্স" ব্যবহার করেছি
মিকা

@ মিকা: আপনি আপনার প্রকল্প সেটিংসের ভিতরে এই বিকল্পটি কোথায় রেখেছিলেন? আমাকে একই বিকল্পটি ব্যবহার করতে হবে, এবং কোথায় রাখব তা আমি জানি না ...
flaviu2

@ flaviu2 পৃষ্ঠায় একটি "অতিরিক্ত কমান্ড" ক্ষেত্রের যেখানে সমস্ত সংকলন কমান্ড সংক্ষিপ্ত করা হয়েছে in তবে এই মুহুর্তে চেক করতে পারছেন না
মিকা

এটি যুক্ত করার জন্য: # অন্তর্ভুক্ত <আলগোরিদিম> + নোমিনম্যাক্স
ব্যবহারকারী 638988

89

কোনও সংজ্ঞা দেওয়ার দরকার নেই, কেবল এই সিনট্যাক্সটি ব্যবহার করে ম্যাক্রোকে বাইপাস করুন:

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

1
আপনাকে ধন্যবাদ, এটিই আমার জন্য কার্যকর সমাধান। আমি এমন একটি কোডে কাজ করছি যেখানে আমি উইন্ডোজ থেকে অঙ্কিত কোড ব্যবহারের কোডের কিছু অংশ হিসাবে কেবল NOMINMAX ব্যবহার করতে পারি না যা ম্যাক্রোগুলির প্রয়োজন।
মিকৈল সি গিউমারিস

আপনি কি ব্যাখ্যা করতে পারেন যে যাদুবিদ্যার চারপাশে প্রথম বন্ধনীগুলি কেন ম্যাক্রোকে পরাজিত করতে পারে !? দুর্দান্ত
চেন ওটি

1
আমি হুডের নীচে থাকা সমস্ত যাদু সম্পর্কে পুরোপুরি নিশ্চিত নই, তবে আমি বিশ্বাস করি যে ম্যাক্রো পার্সার ঠিক "মিনিট" ("সুতরাং," মিনিট) ("ম্যাক্রো পার্সার দ্বারা উপেক্ষা করা যায় না replace অর্থহীন () এর ম্যাক্রোর বাইরে কোনও সমস্যা সৃষ্টি করে না
পলিম্যাশ

1
ঝরঝরে সমাধান, তবে নাম minবা max(নমুনা ব্যবহারের ক্ষেত্রে: ইউনিফর্মর্যান্ডম্বরবারিজেটর ধারণার সাথে মানানসই একটি শ্রেণি প্রয়োগ করে) সমস্যা নিয়ে সমস্যার সমাধান করে না ।
নিক বুগালিস

দয়া করে এরিকের উত্তরটি দেখুন, আমি এটি আরও ভাল সমাধান বলে মনে করি। কম হ্যাকি এবং পরিষ্কার।
পলিমেশ

28

অন্যরা যেমন উল্লেখ করেছে, ত্রুটিগুলি ন্যূনতম / সর্বাধিক ম্যাক্রোগুলির কারণে যা উইন্ডো শিরোনামে সংজ্ঞায়িত হয়। এগুলি অক্ষম করার তিনটি উপায় রয়েছে।

1) #define NOMINMAXশিরোলেখ অন্তর্ভুক্ত করার আগে, নিম্নলিখিত ম্যানুগুলিকে প্রভাবিত করার জন্য এটি সাধারণত ম্যাক্রো সংজ্ঞায়িত করার একটি খারাপ কৌশল;

2) NOMINMAXসংকলক কমান্ড লাইন / আইডিই সংজ্ঞায়িত করুন । এই সিদ্ধান্তের খারাপ দিকটি হ'ল আপনি যদি আপনার উত্সগুলি চালনা করতে চান তবে আপনাকে ব্যবহারকারীদেরও এটি করার জন্য সতর্ক করতে হবে;

3) ম্যাক্রোগুলি ব্যবহার করার আগে তাদের কোডগুলিকে কেবল অপরিচিত করুন

#undef min
#undef max

এটি সম্ভবত সবচেয়ে বহনযোগ্য এবং নমনীয় সমাধান।


2
বিকল্প 1 এর সাথে আরেকটি সমস্যাটি হ'ল এটি সর্বদা কার্যকর হয় না। অন্য উইন্ডো শিরোনাম অন্য কোথাও অন্তর্ভুক্ত থাকতে পারে যা gdiplus.h এর মতো এটির প্রয়োজন actually সেক্ষেত্রে বিকল্প 3 আপনার একমাত্র আশা হতে পারে।
shawn1874

27

উইন্ডোজ শিরোনাম নিয়ে মাঝে মাঝে আমার এখনও সমস্যা হয় এবং NOMINMAX- এর প্রকল্পের প্রশস্ত সংজ্ঞায়িত সবসময় কাজ করে না বলে মনে হয়। প্রথম বন্ধনী ব্যবহারের বিকল্প হিসাবে, আমি মাঝে মাঝে টাইপটিকে এর মতো স্পষ্ট করে তুলি:

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

এটি প্রিপ্রোসেসরটির সাথে ম্যাচ করা থেকে বিরতও করে minএবং প্রথম বন্ধনীর তুলনায় তর্কযোগ্যভাবে আরও পঠনযোগ্য।


3
আমি একমত, এটিই সেরা সমাধান। আমি যখন আবার দেখলাম যে অন্য কেউ আমাকে মারধর করেছে তখন আমি আর একটি উত্তর দিতে ফিরে আসছিলাম।
পলিম্যাশ

16

এরকম কিছু চেষ্টা করুন:

#define NOMINMAX
#include <windows.h>

ডিফল্টরূপে, সংজ্ঞায়িত windows.h minএবং maxম্যাক্রো হিসাবে। এগুলি প্রসারিত হয়ে গেলে, যে কোডটি ব্যবহার করার চেষ্টা করে std::min(উদাহরণস্বরূপ) এর মতো কিছু খুঁজবে:

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

ত্রুটি বার্তা আপনাকে বলছে যে std::(x)অনুমোদিত নয়।


5

আমার ক্ষেত্রে, প্রকল্পটি অন্তর্ভুক্ত windows.hবা windef.hসুস্পষ্টভাবে অন্তর্ভুক্ত হয়নি । এটি বুস্ট ব্যবহার করছিল। তাই, আমি প্রকল্পের গিয়ে সমস্যাটির সমাধান Properties -> C/C++ -> Preprocessorএবং সংযোজন NOMINMAXমধ্যে Preprocessor Definitions(বনাম 2013 বনাম 2015)।


ভিএস 2015 এর জন্য ফাইলে ম্যাক্রো সংজ্ঞায়িত করা আমার পক্ষে কাজ করে না। প্রকল্পে সংজ্ঞা কাজ করে।
qqqqq

3

উইন্ডোজ এইচ সহ লোকের জন্য, নিম্নলিখিতটি প্রভাবিত শিরোনামে রাখুন:

#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")

উত্স ফাইলে কেবল # অ্যান্ডফ মিনিট এবং সর্বোচ্চ।

#include windows headers ...

#undef min
#undef max

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


2

এই সমস্যাটি সমাধান করার জন্য আমি প্রহরীকে অন্তর্ভুক্ত fix_minmax.h না করেই কেবল শিরোনাম ফাইল তৈরি করি

#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;

বুনিয়াদি ব্যবহার এরকম।

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

এই পদ্ধতির পেশাদাররা হ'ল এটি প্রতিটি ধরণের অন্তর্ভুক্ত ফাইল বা কোডের অংশের সাথে কাজ করে। min/ maxম্যাক্রোগুলির উপর নির্ভরশীল কোড বা লাইব্রেরিগুলির সাথে ডিল করার সময় এটি আপনার সময় সাশ্রয় করে


1

আমি ধরে নেব উইন্ডোজ। মিনি ম্যাক্রো হিসাবে যেমন সংজ্ঞা দেয় ine

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

এটি ত্রুটির বার্তাটি ব্যাখ্যা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.