এলপিসিএসটিআর, এলপিসিটিআরটি এবং এলপিসিটিআর


109

কি পার্থক্য LPCSTR, LPCTSTRএবং LPTSTR?

স্ট্রিংটিকে LV/ _ITEMস্ট্রাকচার ভেরিয়েবলে রূপান্তর করতে কেন আমাদের এটি করতে হবে pszText:

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

2
আপনি কি বলতে পারবেন "স্ট্রিং" আসলে কী? (যেমন সিএসট্রিং)
জন সাবলীল

উত্তর:


122

আপনার প্রশ্নের প্রথম অংশের উত্তর দিতে:

LPCSTRকনস্ট্রিং স্ট্রিংয়ের পয়েন্টার (এলপি মানে লং পয়েন্টার )

LPCTSTRএকটি const TCHARস্ট্রিংয়ের নির্দেশক, ( TCHARইউনিকোডিকে আপনার প্রকল্পে সংজ্ঞায়িত করা হয়েছে কিনা তার উপর নির্ভর করে প্রশস্ত চর বা চর হয়ে থাকে)

LPTSTRএকটি (অ-কনস্ট্যান্ট) TCHARস্ট্রিংয়ের পয়েন্টার

অতীতে এইগুলি সম্পর্কে কথা বলার সময় বাস্তবে, আমরা সরলতার জন্য "একটি পয়েন্টারকে" একটি বাক্যাংশ রেখেছি, তবে হালকা-রেস-ইন-অরবিট দ্বারা উল্লিখিত হিসাবে তারা সমস্ত পয়েন্টার।

এটি সি ++ স্ট্রিংগুলি বর্ণনা করে এমন একটি দুর্দান্ত কোডড্রজেক্ট নিবন্ধ (বিভিন্ন ধরণের তুলনায় চার্টের 2/3 উপায় দেখুন)


18
সব ভুল. এই জিনিসগুলির কোনটিই স্ট্রিং নয়। তারা সব পয়েন্টার। -1
অরবিটে মেঘের হালকাতা রেস

8
@ লাইটনেসেসিনঅরবিট আপনি প্রযুক্তিগতভাবে সঠিক - যদিও আমার অভিজ্ঞতায় সি ++ তে স্ট্রিংয়ের প্রকারের উল্লেখ করার সময় ব্রেভিটির জন্য "পয়েন্টার টু এ ...." রেখে দেওয়া সাধারণ অভ্যাস
জন সাবলি

2
@ জনসিবল: সি তে, হ্যাঁ সি ++ এ, একেবারে হওয়া উচিত নয় !!
অরবিট

4
লক্ষ্য করুন যে কোডেপ্রজেক্ট নিবন্ধটি 15 বছর আগে লেখা হয়েছিল এবং এটি আপডেট না হওয়া পর্যন্ত ইউনিকোড অক্ষর সম্পর্কে সর্বদা 2 বাইট সম্পর্কে বিভ্রান্তিকর অনুমান রয়েছে। এটা সম্পূর্ণ ভুল। এমনকি ইউটিএফ 16 এ পরিবর্তনশীল দৈর্ঘ্য ... এটি আরও বেশি বলা ভাল যে প্রশস্ত অক্ষরগুলি ইউসিএস -2 এনকোডড এবং এই প্রসঙ্গে "ইউনিকোড" ইউসিএস -2 বোঝায়।
u8it

1
হুম ... এই ক্ষেত্রে, @ লাইটনেসেসেসিনঅরবিট, আমি একটি সংযোজন যুক্ত করব যে সি ++ এর সি-স্ট্রিংগুলিকে উল্লেখ করার সময় "একটিতে পয়েন্টার" রেখে দেওয়া ঠিক হবে, যদি-এবং-কেবলমাত্র যদি নির্দিষ্টভাবে উল্লেখ করা হয় (ক্ষয়িষ্ণু) স্ট্রিং লিটারেলস বা সি-তে লিখিত কোডের সাথে ইন্টারফ্যাকিং / কাজ করার সময়, সি ++ টাইপের পরিবর্তে সি ধরণের উপর নির্ভর করে এবং / অথবা এর মাধ্যমে সি লিঙ্কেজ রয়েছে extern "C"। এগুলি ছাড়াও, হ্যাঁ, এটি অবশ্যই "পয়েন্টার" বিট, বা একটি স্ট্রিং হিসাবে নির্দিষ্ট বর্ণনার প্রয়োজন।
জাস্টিন সময় - মনিকা পুনরায়

87

দ্রুত এবং ময়লা:

LP== এল Ong পি ointer। কেবল পয়েন্টার বা চর * ভাবেন

C= সি onst, এই ক্ষেত্রে, আমি মনে করি তারা অক্ষরের স্ট্রিং একটি কনস্ট, পয়েন্টারটি কনস্ট না হয়ে বোঝায়।

STRহয় স্ট্রিং

Tব্যাপক অক্ষর বা CHAR (TCHAR) কম্পাইল অপশন উপর নির্ভর করে হয়।


16
টি প্রশস্ত চরিত্রের জন্য নয়, এটি বিভিন্ন ধরণের চরিত্রের জন্য। ডাব্লু প্রশস্ত জন্য (ডাব্লুসিএইচআর হিসাবে)। যদি ইউনিকোড সংজ্ঞায়িত করা হয় তবে TCHAR == WCHAR, অন্যথায় TCHAR == CHAR। সুতরাং যদি ইউনিকোড সংজ্ঞায়িত না হয় তবে এলপিসিটিএসটি == এলপিসিএসটিআর।
জাল্ফ

10
এজন্য আমি "সংকলনের বিকল্পগুলির উপর নির্ভর করে" লিখেছিলাম
টিম

14
আমি সত্যিই এই ধরণের ব্যাখ্যা :) ভালবাসি। অনেক অনেক ধন্যবাদ
জাজুন এনগুইন

@ জালফ, তাহলে টি কিসের পক্ষে দাঁড়ায়?
পেসারিয়ার


36

8-বিট আনসিস্ট্রিংস

  • char: 8-বিট অক্ষর - অন্তর্নিহিত সি / সি ++ ডেটা টাইপ
  • CHAR: এর নাম char- উইন্ডোজ ডেটা টাইপ
  • LPSTR: এর নাল-সমাপ্ত স্ট্রিং CHAR ( এল Ong পি ointer)
  • LPCSTR: ধ্রুব নাল-সমাপ্ত এর স্ট্রিং CHAR ( এল Ong পি ointer)

16-বিট ইউনিকোডস্ট্রিংস

  • wchar_t: 16-বিট অক্ষর - অন্তর্নিহিত সি / সি ++ ডেটা টাইপ
  • WCHAR: এর নাম wchar_t- উইন্ডোজ ডেটা টাইপ
  • LPWSTR: এর নাল-সমাপ্ত স্ট্রিং WCHAR ( এল Ong পি ointer)
  • LPCWSTR: ধ্রুব নাল-সমাপ্ত এর স্ট্রিং WCHAR ( এল Ong পি ointer)

UNICODEসংজ্ঞায়িত উপর নির্ভর করে

  • TCHAR: WCHARইউনিকোডির সংজ্ঞা দেওয়া থাকলে এর উপরি; অন্যভাবেCHAR
  • LPTSTR: এর নাল-সমাপ্ত স্ট্রিং TCHAR ( এল Ong পি ointer)
  • LPCTSTR: ধ্রুব নাল-সমাপ্ত এর স্ট্রিং TCHAR ( এল Ong পি ointer)

সুতরাং

| Item              | 8-bit        | 16-bit      | Varies          |
|-------------------|--------------|-------------|-----------------|
| character         | CHAR         | WCHAR       | TCHAR           |
| string            | LPSTR        | LPWSTR      | LPTSTR          |
| string (const)    | LPCSTR       | LPCWSTR     | LPCTSTR         |

বোনাস রিডিং

TCHARপাঠ্য চর ( সংরক্ষণাগার.আইস )


4
লজ্জার এই উত্তরটি এটিকে কখনই শীর্ষে তুলবে না কারণ এটি এতটা নতুন .. এটি সত্যই কিছু ঠিক করার দরকার। এটি এখন পর্যন্ত সেরা উত্তর।
ড্যান বেচার্ড

আমি ইউনিকোড প্রকল্পে কাজ করার সময় এটি আমাকে সত্যিই অনেক সাহায্য করে। ধন্যবাদ!
Yoon5oo

চমৎকার উত্তর. আমি মনে করি এটি যুক্ত করার মতো যে ইউনিকোড সংস্করণটি ইউটিএফ 16 ব্যবহার করে, সুতরাং প্রতিটি 16-বিট অংশ কোনও অক্ষর নয়, কোড-ইউনিট। নামগুলি historicalতিহাসিক (যখন ইউনিকোড === ইউসিএস 2)।
মার্গারেট ব্লুম

5

জন এবং টিমের উত্তর যুক্ত করা।

আপনি Win98 এর জন্য কোডিং না করা আপনার অ্যাপ্লিকেশনটিতে ব্যবহার করা উচিত ++ স্ট্রিংয়ের মধ্যে দুটি মাত্র রয়েছে

  • LPWSTR
  • LPCWSTR

বাকিগুলি এএনএসআই প্ল্যাটফর্ম বা দ্বৈত সংকলন সমর্থন করে। এগুলি আজকের মতো প্রাসঙ্গিক নয়।


2
@ ব্লুরাজা, আমি আমার উত্তরে সি ভিত্তিক স্ট্রিংগুলি উল্লেখ করছিলাম। তবে সি ++ এর জন্য আমি এড়াতে পারব std::stringকারণ এটি এখনও একটি ASCII ভিত্তিক স্ট্রিং এবং std::wstringপরিবর্তে পছন্দ করে।
জেয়ার্ডপাড়

1
আপনি সরাসরি ASCII (* A) বা উইডচার (* ডাব্লু) সংস্করণগুলির ফাংশনগুলি কল না করে আপনার এলপিটিএসটিআর এবং এলপিসিটিএসটিআর ব্যবহার করা উচিত। আপনি সংকলন করার সময় আপনি যে অক্ষরের প্রস্থের উল্লেখ করেছেন সেগুলির এগুলিই এর عرفস।
ওসভেইন

... এবং এখন যে মাইক্রোসফ্ট *Aউইনাপি-র সংস্করণগুলি ইউটিএফ -8 কোড পৃষ্ঠার সাথে সামঞ্জস্যপূর্ণ করার জন্য কাজ করছে , হঠাৎ সেগুলি অনেক বেশি প্রাসঙ্গিক। ; পি
জাস্টিন সময় - মনিকা

4

আপনার প্রশ্নের দ্বিতীয় অংশের উত্তর দেওয়ার জন্য আপনার পছন্দ মতো জিনিসগুলি করা দরকার

LV_DISPINFO dispinfo;  
dispinfo.item.pszText = LPTSTR((LPCTSTR)string);

কারণ মাইক্রোসফট এর LVITEMstruct হয় একটি হয়েছে LPTSTR, অর্থাত্ একটি চপল টি-স্ট্রিং পয়েন্টার, কোনো LPCTSTR। আপনি কি করছেন

1) string( CStringঅনুমান অনুসারে) কে একটিতে রূপান্তর করুন ( LPCTSTRযা অনুশীলনের অর্থ এটি কেবলমাত্র পঠনযোগ্য পয়েন্টার হিসাবে তার চরিত্রের বাফারের ঠিকানা পাওয়া)

2) কেবলমাত্র পঠনযোগ্য পয়েন্টারটিকে তার const-ness বাদ দিয়ে লেখার যোগ্য পয়েন্টারে রূপান্তর করুন ।

এটি নির্ভর করে dispinfoযা আপনার ListViewকলটি সেই মাধ্যমে লেখার চেষ্টা শেষ করে দেবে এমন কোনও সুযোগ আছে কি না তার জন্য কী ব্যবহৃত হয় pszText। যদি এটি হয় তবে এটি একটি সম্ভাব্য খুব খারাপ জিনিস: সর্বোপরি আপনাকে কেবল পঠনযোগ্য পয়েন্টার দেওয়া হয়েছিল এবং তারপরে এটিকে লিখনযোগ্য হিসাবে বিবেচনা করার সিদ্ধান্ত নিয়েছে: সম্ভবত এটি কেবল পঠন করার কারণ রয়েছে!

যদি আপনি এটির CStringসাথে কাজ করেন তবে আপনার কাছে ব্যবহারের বিকল্প রয়েছে string.GetBuffer()- যা ইচ্ছাকৃতভাবে আপনাকে একটি লিখনযোগ্য দেয় LPTSTR। তারপরে ReleaseBuffer()স্ট্রিংটি পরিবর্তিত হয়ে গেলে আপনাকে কল করতে হবে। অথবা আপনি একটি স্থানীয় অস্থায়ী বাফার বরাদ্দ করতে এবং সেখানে স্ট্রিংটি অনুলিপি করতে পারেন।

99% সময় এটি অপ্রয়োজনীয় হবে এবং LPCTSTRএকটি হিসাবে LPTSTRকাজ করবে হিসাবে কাজ করবে ... তবে একদিন, যখন আপনি কমপক্ষে এটি আশা করেন ...


1
আপনার xxx_cast<>()পরিবর্তে সি স্টাইলের কাস্ট করা এবং ব্যবহার করা উচিত।
হার্পার

@ হার্পার আপনি বেশ ঠিক বলেছেন - তবে আমি ওপিটি উদ্ধৃত করছিলাম, এই কোডটি তিনিই জিজ্ঞাসা করেছিলেন। আমি যদি কোডটি নিজে লিখে থাকি তবে অবশ্যই এটি xxx_cast<>দুটি পৃথক বন্ধনী ভিত্তিক ingালাই শৈলীর মিশ্রণের পরিবর্তে ব্যবহার করা হত !
এ্যাট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.