সি ++ পুনরায় সংজ্ঞা শিরোনাম ফাইলগুলি (winsock2.h)


143

আমি দুবার হেডার ফাইল অন্তর্ভুক্ত করা থেকে কীভাবে বাধা দেব? সমস্যা আমি অন্তর্ভুক্ত করছিমাইক্লাসহ'তে এবং তারপরে আমি মাইক্লাস.কে অনেকগুলি ফাইলে অন্তর্ভুক্ত করছি , সুতরাং এতে একাধিকবার অন্তর্ভুক্ত হয় এবং পুনরায় সংজ্ঞা ত্রুটি ঘটে। কিভাবে প্রতিরোধ?

আমি রক্ষীদের অন্তর্ভুক্ত করার পরিবর্তে একবার # প্রগমা ব্যবহার করছি এবং আমার ধারণা এটি ভাল।

MyClass.h:

// MyClass.h
#pragma once

#include <winsock2.h>

class MyClass
{

// methods
public:
 MyClass(unsigned short port);
 virtual ~MyClass(void);
};

সম্পাদনা: আমি যে ত্রুটিগুলি পাচ্ছি তার মধ্যে কয়েকটি

c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : warning C4005: 'AF_IPX' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(460) : see previous definition of 'AF_IPX'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(124) : warning C4005: 'AF_MAX' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(479) : see previous definition of 'AF_MAX'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(163) : warning C4005: 'SO_DONTLINGER' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(402) : see previous definition of 'SO_DONTLINGER'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(485) : see declaration of 'sockaddr'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing '}' before 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2143: syntax error : missing ';' before 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(384) : error C2059: syntax error : 'constant'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C2143: syntax error : missing ';' before '}'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(518) : warning C4005: 'IN_CLASSA' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(287) : see previous definition of 'IN_CLASSA'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(524) : warning C4005: 'IN_CLASSB' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(293) : see previous definition of 'IN_CLASSB'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(530) : warning C4005: 'IN_CLASSC' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(299) : see previous definition of 'IN_CLASSC'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(541) : warning C4005: 'INADDR_ANY' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(304) : see previous definition of 'INADDR_ANY'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(543) : warning C4005: 'INADDR_BROADCAST' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(306) : see previous definition of 'INADDR_BROADCAST'
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(577) : error C2011: 'sockaddr_in' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(312) : see declaration of 'sockaddr_in'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(132) : error C2011: 'fd_set' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(68) : see declaration of 'fd_set'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(167) : warning C4005: 'FD_SET' : macro redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(102) : see previous definition of 'FD_SET'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(176) : error C2011: 'timeval' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(111) : see declaration of 'timeval'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(232) : error C2011: 'hostent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(167) : see declaration of 'hostent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(245) : error C2011: 'netent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(180) : see declaration of 'netent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(252) : error C2011: 'servent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(187) : see declaration of 'servent'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(264) : error C2011: 'protoent' : 'struct' type redefinition
        c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(199) : see declaration of 'protoent'

4
আপনি ইতিমধ্যে একবার # প্রগমা ব্যবহার করছেন, সুতরাং এটি একবারে অন্তর্ভুক্ত করা উচিত।
নবীন

1
আপনার সংকলক একবার প্রাগমা সমর্থন করে না?
স্বেত্লোজার অ্যাঞ্জেলভ

আমি ভিজ্যুয়াল স্টুডিও ২০০৮ ব্যবহার করছি, তাহলে <winsock2.h> কেন দু'বার অন্তর্ভুক্ত?
আকিফ

1
এটি MyClass.h থেকে অন্তর্ভুক্ত কয়েকটি হেডার থেকে দুবার অন্তর্ভুক্ত থাকতে পারে
স্বেত্লোজার অ্যাঞ্জেলভ

5
উইনসক 2 এবং উইনসকের সাধারণ কাঠামো রয়েছে। আপনাকে তাদের মধ্যে কেবল
একটিকেই

উত্তর:


234

এই সমস্যাটি যখন <windows.h>আগে অন্তর্ভুক্ত করা হয় তখন ঘটে <winsock2.h>। ব্যবস্থা আপনার অন্তর্ভুক্ত তালিকা যে চেষ্টা <windows.h>পর অন্তর্ভুক্ত করা হয় <winsock2.h>বা সংজ্ঞায়িত _WINSOCKAPI_প্রথম:

#define _WINSOCKAPI_    // stops windows.h including winsock.h
#include <windows.h>
// ...
#include "MyClass.h"    // Which includes <winsock2.h>

আরও দেখুন এই


আমি মোটেও <উইন্ডোজ এইড> অন্তর্ভুক্ত করছি না, আমি জানি <winsock2.h> এটি আমার জন্য করে।
আকিফ

2
আমার জন্য আপনার কোডটি কেবলমাত্র <winsock2.h>এমএসভিসি ২০০৮ এ সংকলন করে। <windows.h>অন্তর্ভুক্তি এটি সরবরাহ করার সাথে সাথে অভিন্ন সংকলন ত্রুটিগুলি তৈরি করে।
pingw33n 11

<উইন্ডোজ এইচ> কি stdafx.h এ অন্তর্ভুক্ত হচ্ছে?
কলিন ডেসমন্ড

1
এই সমাধানটি SDK 7.1 এর সাথে আমার কাছে ভিএস 2010 এ সমস্যাটি স্থির করেছে। ধন্যবাদ pingw33n!
অ্যাডামফিস্ক

আমি #include <winsock2.h> #include <ws2tcpip.h> #include <windows.h>ক্রম ছিল এবং winsock2 পেয়েছিলাম, এইচ ফাইল পাওয়া যায় নি। অন্তর্ভুক্ত #define _WINSOCKAPI_ 3 উপরে এখনও একই ত্রুটি রয়েছে
আভা

75

অন্যরা যেমন পরামর্শ দিয়েছিল, সমস্যাটি তখন windows.hআগে অন্তর্ভুক্ত করা হয় WinSock2.h। কারণ windows.hঅন্তর্ভুক্ত winsock.h। আপনি WinSock2.hএবং উভয় ব্যবহার করতে পারবেন না winsock.h

সলিউশন:

  • WinSock2.hআগে অন্তর্ভুক্ত করুন windows.h। পূর্বনির্ধারিত শিরোনামগুলির ক্ষেত্রে, আপনার এটি এখানে সমাধান করা উচিত। সাধারণ প্রকল্পের ক্ষেত্রে এটি সহজ। তবে বড় প্রকল্পগুলিতে (বিশেষত পোর্টেবল কোড লেখার সময়, পূর্বনির্ধারিত শিরোনাম ছাড়াই) এটি খুব শক্ত হতে পারে, কারণ যখন আপনার শিরোনামটি WinSock2.hঅন্তর্ভুক্ত করা হয়, windows.hইতিমধ্যে অন্য কোনও শিরোনাম / বাস্তবায়ন ফাইল থেকে অন্তর্ভুক্ত করা যেতে পারে।

  • প্রকল্পের WIN32_LEAN_AND_MEANআগে windows.hবা সংজ্ঞা দিন Def তবে এটি আপনার প্রয়োজন হতে পারে এমন অনেকগুলি জিনিস বাদ দেবে এবং আপনার নিজের দ্বারা এটি অন্তর্ভুক্ত করা উচিত।

  • প্রকল্পের _WINSOCKAPI_আগে windows.hবা সংজ্ঞা দিন Def আপনি যখন অন্তর্ভুক্ত করবেন তখন আপনি WinSock2.hম্যাক্রো পুনঃনির্ধারণের সতর্কতা পাবেন।

  • আপনার প্রকল্পের জন্য কখন পর্যাপ্ত windows.hহবে তার পরিবর্তে ব্যবহার করুন (বেশিরভাগ ক্ষেত্রে এটি হয়)। এটি সম্ভবত দীর্ঘ সংকলনের সময় তৈরি করবে তবে কোনও ত্রুটি / সতর্কতা সমাধান করবে।WinSock2.hwinsock.h


14
WIN32_LEAN_AND_MEANআমার জন্য অনেক ট্যাঙ্কগুলির সমাধান ছিল
জোনাটন ক্লিউটিয়ার

_WINSOCK_সমাধান সম্পর্কে : উভয় সংজ্ঞা একইরকম হলে আপনার ম্যাক্রো পুনঃনির্ধারণের সতর্কতাটি হওয়া উচিত নয়। সাধারণ বাগটি হ'ল লোকেরা কোনও মান সেট না করেই প্রকল্পটিতে সংজ্ঞা যুক্ত করে এবং খালি সংজ্ঞা আশা করে। তবে, আপনি যদি -D_WINSOCK_সিএমডি লাইন যুক্ত করেন তবে এটি _WINSOCK_1 এ সেট হবে। খালি সংজ্ঞা তৈরি করতে, -D_WINSOCK_=অবশ্যই পাস করতে হবে।
পাউয়ে স্টানকোভস্কি

আপনি যদি ব্যবহার করেন তবে আপনার পরিস্থিতির উপর নির্ভর করে আপনারও #define _WINSOCKAPI_প্রয়োজন হতে পারে #define _WINSOCK_DEPRECATED_NO_WARNINGS
লরিয়ান ব্রুন

16

ওহ - উইন্ডোজের কদর্যতা ... এর সাথে অর্ডার অফ করা এখানে গুরুত্বপূর্ণ। উইন্ডোজ। Hd এর আগে আপনাকে winsock2.h অন্তর্ভুক্ত করতে হবে যেহেতু উইন্ডোজ এইচটি সম্ভবত আপনার পূর্বনির্ধারিত শিরোনাম (stdafx.h) থেকে অন্তর্ভুক্ত রয়েছে, সুতরাং আপনাকে সেখান থেকে winsock2.h অন্তর্ভুক্ত করতে হবে:

#include <winsock2.h>
#include <windows.h>

14

"শিরোনাম রক্ষী" ব্যবহার করে:

#ifndef MYCLASS_H
#define MYCLASS_H

// This is unnecessary, see comments.
//#pragma once

// MyClass.h

#include <winsock2.h>

class MyClass
{

// methods
public:
    MyClass(unsigned short port);
    virtual ~MyClass(void);
};

#endif

2
আমি অনুমান করি আমি ভুল (এখন অবধি 4 টি আপোটিস), তবে আমি মনে করি অন্তর্ভুক্ত প্রহরীদের ব্যবহার করা একবার প্রগমার সমান, আপনি উভয়কে রেখেছেন?
স্বেত্লোজার অ্যাঞ্জেলভ

1
আচ্ছা, আমি একবার # প্রাগমা পেয়েছি যা আফাইক একই শিরোনাম রক্ষী
আকিফ

2
@ অ্যাঞ্জেলভ: হ্যাঁ, আমি যা বলছি তারা একই জিনিস। সমস্যাটি আমার শিরোনামের ফাইলগুলির সাথে নয়, তবে আমি মনে করি <winsock2.h> নিজেই শিরোনাম প্রহরী নেই বা অন্য কিছু হতে পারে।
আকিফ

1
সংজ্ঞা অনুসারে # প্রগমা হ'ল সংকলক নির্ভর (অ-মানক)। এটি সমস্ত সংকলকগুলিতে কাজ না করে। আমি জানি ভিজ্যুয়াল স্টুডিও একবার # পারগমা গ্রহণ করে। জিসিসি করলে আমি নিশ্চিত নই। আমি জানি যে সবসময় রক্ষীদের কাজের অন্তর্ভুক্ত। আমি উভয়ই # প্রগমা ব্যবহার করি এবং সর্বোচ্চ প্রতিরক্ষার জন্য প্রহরীকে অন্তর্ভুক্ত করি। দেখে মনে হচ্ছে এমএসভিসি একবার # প্রাগমা হ্যান্ডলিংকে অনুকূলিত করেছে এবং জিসিসি অন্তর্ভুক্ত রক্ষীদের হ্যান্ডলিংকে অনুকূলিত করেছে। আমার স্ট্যান্ডার্ড শিরোনামের সাথে একমাত্র পার্থক্য হ'ল # প্রাগাগা একবার অন্তর্ভুক্ত রক্ষীদের বাইরে।
কিটসুনওয়াইএমজি

1
'#Pragma' কমান্ডটি স্বেচ্ছাসেবী বাস্তবায়ন-সংজ্ঞায়িত প্রভাব রাখতে এএনএসআই স্ট্যান্ডার্ডে নির্দিষ্ট করা হয়েছে। জিএনইউ সি প্রিপ্রসেসর, '# প্রগমা' প্রথমে গেমটি 'দুর্বৃত্ত' চালানোর চেষ্টা করে; যদি এটি ব্যর্থ হয়, তবে এটি 'হ্যাক' গেমটি চালানোর চেষ্টা করে; যদি এটি ব্যর্থ হয়, এটি হেনোর টাওয়ার প্রদর্শিত জিএনইউ ইম্যাক্স চালানোর চেষ্টা করে; যদি এটি ব্যর্থ হয় তবে এটি মারাত্মক ত্রুটির খবর দেয়। যে কোনও ক্ষেত্রে, প্রিপ্রোসেসিং চালিয়ে যায় না। - রিচার্ড এম স্টলম্যান, দ্য জিএনইউ সি প্রিপ্রোসেসর, সংস্করণ 1.34
দেবসোলার

6

তৃতীয় পক্ষের প্যাকেজটি টানার চেষ্টা করার সময় আমি এই সমস্যায় পড়েছিলাম যা দৃশ্যত উইন্ডোজ এইচ সহ কোথাও এর শিরোনামগুলির মধ্যে গোলমাল রয়েছে। _WINSOCKAPI_প্রকল্পের স্তরে সংজ্ঞায়িত করা তাদের স্যুপের মাধ্যমে ওয়াডিং এবং সমস্যাযুক্তকে সংশোধন করার চেয়ে অনেক বেশি সহজ (আরও রক্ষণাবেক্ষণের উল্লেখ না করা) ছিল।


1
Qt- এ, .pro ফাইলে, দেখে মনে হচ্ছে: DEFINES += _WINSOCKAPI_
ফায়াট

@ ফাইয়াট: আপনি যদি উত্তর না দেন তবে আপনার উত্তরটি দেওয়া উচিত!
লিফ গ্রুইনওল্ড

@ লিফগ্রুয়েনউল্ড এটি এর জন্য যান! আমি সাহায্য করতে পেরে আনন্দিত.
ফায়াট

6

ভিএস 2015 এ, নিম্নলিখিতগুলি কাজ করবে:

#define _WINSOCKAPI_

যদিও নিম্নলিখিতগুলি এটি করবে না:

#define WIN32_LEAN_AND_MEAN

6

আমি চেক রিকার্সিভ অন্তর্ভুক্ত, আমি হেডার ফাইল যা (যাও recursively) অন্তর্ভুক্ত বিক্ষোভ কিছু #include "windows.h"এবং #include "Winsock.h"এবং একটি লিখতে #include "Winsock2.h"। এই ফাইলগুলিতে আমি যুক্ত করেছি#include "Winsock2.h" প্রথম অন্তর্ভুক্ত হিসাবে ।

ধৈর্য ব্যাপার রয়েছে বর্ণন এ একের পর এক এবং এই আদেশ স্থাপন, প্রথম #include "Winsock2.h"তারপর#include "windows.h"


5

আমি এই লিঙ্কটি উইন্ডোজ h এবং winsock2.h পেয়েছি যার একটি বিকল্প রয়েছে যা আমার জন্য দুর্দান্ত কাজ করেছে:

#define _WINSOCKAPI_    // stops windows.h including winsock.h
#include <windows.h>
#include <winsock2.h>

সমস্যাটি কোথায় ঘটেছে তা খুঁজে পেতে আমার সমস্যা হয়েছে তবে এই # ডিফাইন যুক্ত করে আমি এটি নির্ধারণ না করেই তৈরি করতে সক্ষম হয়েছি।


4

আমি কেবল FILENAME_H ব্যবহার করব না তবে

#ifndef FILENAME_H_AF06570D_B36E_4B82_8F97_C456AF4A38FD
#define FILENAME_H_AF06570D_B36E_4B82_8F97_C456AF4A38FD

//code stuff
#endif // FILENAME_H_AF06570D_B36E_4B82_8F97_C456AF4A38FD

আমি সর্বদা একটি পোস্টফিক্স গাইড ব্যবহার করেছি। আমি বেশ কয়েক বছর আগে একটি খুব দুর্বল কোড বেসটি পেয়েছিলাম যার একই ফাইলের নামের সাথে বিভিন্ন শিরোনাম ফাইল ছিল এবং এতে রক্ষীও অন্তর্ভুক্ত রয়েছে। প্রশ্নযুক্ত ফাইলগুলি একই নামের সাথে একটি শ্রেণি সংজ্ঞায়িত করেছিল। যদি কেবল নেমস্পেস ব্যবহার করা হত। কিছু প্রকল্প সংকলিত কিছু করেনি। শিরোনাম এবং তাদের বিষয়বস্তুগুলির পার্থক্য করার জন্য অনন্য রক্ষীদের ব্যবহার করা সমাধানের একটি অংশ ছিল।

উইন্ডোজটিতে ভিজ্যুয়াল স্টুডিও সহ গাইডেন্স.এক্সই, লিনাক্স ইউইডজেন -t ব্যবহার করুন।


4

আমি একই সমস্যাটিতে চলে এসেছি এবং আমি এখন পর্যন্ত যা আবিষ্কার করেছি তা এখানে:

এই আউটপুট টুকরা থেকে -

c: files প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট sdks \ উইন্ডোজ \ v6.0a অন্তর্ভুক্ত \ ws2def.h (91): সতর্কতা C4005: 'AF_IPX': ম্যাক্রো পুনঃনির্ধারণ
c: files প্রোগ্রাম ফাইলগুলি \ মাইক্রোসফ্ট sdks \ উইন্ডোজ \ v6.0a \ অন্তর্ভুক্ত \ winsock.h (460): 'AF_IPX' এর পূর্ববর্তী সংজ্ঞাটি দেখুন

এটি প্রদর্শিত হয় যে ws2def.h এবং winsock.h উভয়ই আপনার সমাধানে অন্তর্ভুক্ত করা হয়েছে।

আপনি যদি ws2def.h ফাইলটি দেখেন তবে এটি নীচের মন্তব্য দিয়ে শুরু হয় -

/*++

Copyright (c) Microsoft Corporation. All rights reserved.

Module Name:

    ws2def.h

Abstract:

    This file contains the core definitions for the Winsock2
    specification that can be used by both user-mode and 
    kernel mode modules.

    This file is included in WINSOCK2.H. User mode applications
    should include WINSOCK2.H rather than including this file
    directly. This file can not be included by a module that also
    includes WINSOCK.H.

Environment:

    user mode or kernel mode

--*/

শেষ লাইনে মনোযোগ দিন - "এই ফাইলটি এমন একটি মডিউল দ্বারা অন্তর্ভুক্ত করা যাবে না যা WINSOCK.H অন্তর্ভুক্ত করে"

কোডে কোনও পরিবর্তন না করেই সমস্যাটি সংশোধন করার চেষ্টা করছেন।

যদি এটি বোঝা যায় তবে আমাকে জানান।


2

আপনার হেডার গার্ড ব্যবহার করা উচিত।

হেডার ফাইলের শীর্ষে সেই লাইনটি রাখুন

#ifndef PATH_FILENAME_H
#define PATH_FILENAME_H

এবং নীচে

#endif

1
# প্রাগমা একবার এবং রক্ষীদের অন্তর্ভুক্ত একই জিনিস তাই না?
আকিফ

এগুলি এক রকম নয় - শিরোনামের রক্ষীরা প্রিপ্রসেসর স্তরে ফাইলটি পুনরায় অন্তর্ভুক্ত করতে বাধা দেবে, এবং তারা সম্ভবত #pragma এর চেয়ে বেশি পোর্টেবল হবে।
টিমো জিউশ

1
আমি বোঝাতে চাইছি তারা একই উদ্দেশ্যে নির্মিত হয়েছে :)
আকিফ

2
# প্রগমাটি একবার অ-মানক, আফাক
এনটকমং

2

#pragma onceফাইলের পুরো পথের উপর ভিত্তি করে। সুতরাং আপনার সম্ভবত যা আছে তা হ'ল মাইক্লাস। H অথবা উইনসক 2 এইচ-এর দুটি একই অনুলিপি বিভিন্ন ডিরেক্টরিতে রয়েছে।


একটি প্রতীকী লিঙ্ক বা এনটিএফএস জংশন সিস্টেমটিও ভেঙে দেবে।
থোমি

1

#pragma onceflakey, এমনকি এমএস সংকলকগুলিতেও রয়েছে এবং অন্য অনেক সংকলক দ্বারা এটি সমর্থন করে না। অন্যান্য অনেক লোক যেমন উল্লেখ করেছেন, অন্তর্ভুক্ত রক্ষীদের ব্যবহার হ'ল উপায়। মোটেও ব্যবহার করবেন না #pragma once- এটি আপনার জীবনকে আরও সহজ করে তুলবে।


3
দুর্ভাগ্যক্রমে, আমি দেখেছি শূন্যের চেয়েও বেশি রক্ষী রয়েছে রক্ষীদের অন্তর্ভুক্ত, যেখানে টাইপোর অর্থ রক্ষী প্রকৃতপক্ষে কাজ করে না, বা যেখানে বিভিন্ন ডিরেক্টরিতে একই নামের ফাইলগুলি একই টোকেন ব্যবহার করে, বা যেখানে টোকেন ব্যবহৃত ডাবল দিয়ে শুরু হয় আন্ডারস্কোর বা আন্ডারস্কোর তারপর মূলধনী (এবং এর ফলে নন-পোর্টেবল কেবল # প্রাগামার মত একবার)। সুতরাং অন্তর্নিহিতভাবে অ-বহনযোগ্য কোডের জন্য, উইনসক.এস ব্যবহার করার মতো কোনও কিছুর জন্য, আমি # প্রাগমা দ্বারা গভীরভাবে অসন্তুষ্ট হয়েছি আপনি একবার বলেছিলেন যে এটি ফ্লকি ছিল। একেবারে সমর্থন না করা ব্যতীত কখন এটি ব্যর্থ হয়?
স্টিভ জেসোপ

3
ব্যবহার #pragma onceকরার সময়, সংকলকটি অনন্য আইডি হিসাবে শিরোলেখ ফাইল নোডের নাম নেয়। আপনার উত্স ট্রিতে যদি আপনার প্রতীকী লিঙ্ক বা এনটিএফএস জংশন থাকে তবে এটি ব্যর্থ হতে পারে (আপনার মনে হতে পারে তার চেয়ে বেশি সাধারণ), অথবা অন্য সিস্টেমে একই নামের একটি ফাইল ডিরেক্টরিতে অন্তর্ভুক্ত থাকলেও (আমার যখন ছিল তখন এটি আমার সাথে ঘটেছিল) সংস্করণ 1 এবং দুটি পৃথক সিস্টেমে একই লাইব্রেরির 2 সংস্করণ ইনস্টল করা পাথ অন্তর্ভুক্ত করে)। নীচের লাইন: আমার জন্য, আমি আরও নিয়ন্ত্রণ করতে পছন্দ করি এবং আমার জন্য এটি করার জন্য কোনও সংকলককে বিশ্বাস না করে মাঝে মাঝে ভিটওয়্যার ভুল করে বাঁচি।
থোমি


1

আমার প্রকল্পে (আমি ভিএস ২০০৮ এসপি 1 ব্যবহার করি) এর পরবর্তী সমাধানটি কাজ করে:

শিরোনাম ফাইল:

//myclass.h
#pragma once
#define _WINSOCKAPI_
#include <windows.h>

সিপিপি ক্লাস:

//myclass.cpp
#include "Util.h"
#include "winsock2class.h"
#pragma comment(lib, "Ws2_32.lib")

যেখানে # winsock2class.h "অন্তর্ভুক্ত মানে ক্লাস যা উইনসক 2 h বাস্তবায়িত করেছে:

//winsock2class.h
#include <winsock2.h>
#include <windows.h>
#pragma comment(lib, "Ws2_32.lib")

0

আমি আসলে একটি ইস্যুতে দৌড়েছি যেখানে আমাকে উইনসক ২ এইচকে প্রথম হিসাবে অন্তর্ভুক্ত হিসাবে সংজ্ঞায়িত করতে হয়েছিল, মনে হয় এটির অন্যান্য প্যাকেজগুলির অন্তর্ভুক্ত অন্যান্য সমস্যা রয়েছে। আশা করি এটি কারওর জন্য সহায়ক যারা কেবল একই উইন্ডোজে নয়, সবগুলিই অন্তর্ভুক্ত করে issue

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