কেন এই দাবিটি ডেরিফারেন্সিং টাইপ-পেনড পয়েন্টার সতর্কতা সংকলক-নির্দিষ্ট?


38

আমি পড়েছি বিভিন্ন পোস্ট উপর স্ট্যাক ওভারফ্লো Re: derefercing টাইপ-punned পয়েন্টার ত্রুটি। আমার বোধগম্যতাটি হ'ল ত্রুটিটি মূলত একটি ভিন্ন ধরণের পয়েন্টারের মাধ্যমে কোনও বস্তুর অ্যাক্সেসের বিপদ সম্পর্কে সংকলক সতর্কতা (যদিও এর ব্যতিক্রম ব্যতিক্রম বলে মনে হয় char*) যা একটি বোধগম্য এবং যুক্তিসঙ্গত সতর্কতা।

আমার প্রশ্নটি নীচের কোডের সাথে সুনির্দিষ্ট: কেন পয়েন্টারের ঠিকানা void**এই সতর্কতার জন্য যোগ্যতা অর্জন করে (এর মাধ্যমে ত্রুটি হিসাবে প্রচারিত হয় -Werror)?

তদুপরি, এই কোডটি একাধিক টার্গেট আর্কিটেকচারের জন্য সংকলিত হয়েছে, যার মধ্যে একটি মাত্র সতর্কতা / ত্রুটি উত্পন্ন করে - এটি কি বোঝাতে পারে যে এটি বৈধভাবে সংকলক সংস্করণ-নির্দিষ্ট ঘাটতি?

// main.c
#include <stdlib.h>

typedef struct Foo
{
  int i;
} Foo;

void freeFunc( void** obj )
{
  if ( obj && * obj )
  {
    free( *obj );
    *obj = NULL;
  }
}

int main( int argc, char* argv[] )
{
  Foo* f = calloc( 1, sizeof( Foo ) );
  freeFunc( (void**)(&f) );

  return 0;
}

উপরের বর্ণিত আমার বোধগম্যটি যদি সঠিক হয়, ক void**, এখনও মাত্র পয়েন্টার হয়ে থাকে তবে এটি নিরাপদ ingালাই হওয়া উচিত।

এই সংকলক-নির্দিষ্ট সতর্কতা / ত্রুটি প্রশমিত করবে এমন লভালিউস ব্যবহার না করে এমন কোনও কাজ রয়েছে কি ? আমি এটি বুঝতে পারি এবং এটি কেন এই সমস্যার সমাধান করবে, তবে আমি এই পদ্ধতিকে এড়াতে চাই কারণ আমি একটি উদ্দেশ্যপ্রাপ্ত আউট-আর্গুলেশন freeFunc() নুলের সুবিধা নিতে চাই :

void* tmp = f;
freeFunc( &tmp );
f = NULL;

সমস্যা সংকলক (একটির একটি):

user@8d63f499ed92:/build$ /usr/local/crosstool/x86-fc3/bin/i686-fc3-linux-gnu-gcc --version && /usr/local/crosstool/x86-fc3/bin/i686-fc3-linux-gnu-gcc -Wall -O2 -Werror ./main.c
i686-fc3-linux-gnu-gcc (GCC) 3.4.5
Copyright (C) 2004 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

./main.c: In function `main':
./main.c:21: warning: dereferencing type-punned pointer will break strict-aliasing rules

user@8d63f499ed92:/build$

অভিযোগ না করা সংকলক (অনেকের মধ্যে একটি):

user@8d63f499ed92:/build$ /usr/local/crosstool/x86-rh73/bin/i686-rh73-linux-gnu-gcc --version && /usr/local/crosstool/x86-rh73/bin/i686-rh73-linux-gnu-gcc -Wall -O2 -Werror ./main.c
i686-rh73-linux-gnu-gcc (GCC) 3.2.3
Copyright (C) 2002 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

user@8d63f499ed92:/build$

আপডেট: আমি আরও আবিষ্কার করেছি যে সতর্কতাটি নির্দিষ্টভাবে সংঘটিত হওয়ার সময় উত্পন্ন হয়েছে বলে মনে হচ্ছে -O2(এখনও কেবলমাত্র উল্লেখযোগ্য "সমস্যা সংকলক" সহ)



1
"একটি void**, এখনও কেবল পয়েন্টার হিসাবে, এটি নিরাপদ ingালাই হওয়া উচিত" " ওহ ওদিকে স্কিপি! আপনার মতো কিছু প্রাথমিক অনুমান চলছে বলে মনে হচ্ছে। বাইটস এবং লিভারের ক্ষেত্রে এবং বিমূর্ততার ক্ষেত্রে আরও কম ভাবার চেষ্টা করুন, কারণ আপনি
এটির

7
স্পর্শকাতরভাবে, আপনি যে সংকলকগুলি ব্যবহার করছেন তা 15 এবং 17 বছর বয়সী! আমি একটিরও উপর নির্ভর করব না।
তাভিয়ান বার্নেস

4
@ টাভিয়ানবার্নস এছাড়াও, যদি আপনাকে কোনও কারণে জিসিসি 3 এর উপর নির্ভর করতে হয়, তবে শেষের দিকের শেষ সংস্করণটি ব্যবহার করা ভাল, যা 3.4.6 ছিল, আমি মনে করি। বিশ্রাম নেওয়ার আগে কেন এই সিরিজের সমস্ত উপলব্ধ সংশোধনগুলির সুবিধা নেবেন না।
কাজ

সি ++ এর কোডিং স্ট্যান্ডার্ড কী ধরণের সমস্ত শূন্যস্থান নির্ধারণ করে?
পিটার মর্টেনসেন

উত্তর:


33

টাইপের মান void**হ'ল টাইপের কোনও অবজেক্টের পয়েন্টার void*। টাইপের Foo*একটি অবজেক্ট টাইপের অবজেক্ট নয় void*

তার মাঝে একটি অন্তর্নিহিত রূপান্তর হয় মান ধরনের Foo*এবং void*। এই রূপান্তরটি মানটির উপস্থাপনা পরিবর্তন করতে পারে। একইভাবে, আপনি লিখতে পারেন int n = 3; double x = n;এবং এটিতে xমান নির্ধারণের সু-সংজ্ঞায়িত আচরণ রয়েছে 3.0, তবে double *p = (double*)&n;এটি অপরিবর্তিত আচরণ রয়েছে (এবং pবাস্তবে 3.0কোনও সাধারণ আর্কিটেকচারে "পয়েন্টার টু " সেট করা হবে না )।

আর্কিটেকচার যেখানে বিভিন্ন ধরণের পয়েন্টারগুলিতে অবজেক্টগুলির কাছে বিভিন্ন উপস্থাপনা রয়েছে আজকাল বিরল তবে সেগুলি সি স্ট্যান্ডার্ড দ্বারা অনুমোদিত। শব্দের পয়েন্টারযুক্ত (বিরল) পুরানো মেশিনগুলি রয়েছে যা স্মৃতিতে শব্দের ঠিকানা এবং বাইট পয়েন্টার যা এই শব্দের বাইট অফসেটের সাথে শব্দের ঠিকানা; Foo*একটি শব্দ পয়েন্টার void*হতে পারে এবং এই জাতীয় স্থাপত্যে একটি বাইট পয়েন্টার হবে। ফ্যাট পয়েন্টারযুক্ত (বিরল) মেশিনগুলিতে কেবলমাত্র বস্তুর ঠিকানা সম্পর্কেই নয়, তার ধরণ, আকার এবং এর অ্যাক্সেস নিয়ন্ত্রণের তালিকাগুলি সম্পর্কিত তথ্য রয়েছে; একটি নির্দিষ্ট ধরণের পয়েন্টারটির আলাদা আলাদা উপস্থাপনা থাকতে পারে void*যা রানটাইম সময়ে অতিরিক্ত ধরণের তথ্য প্রয়োজন needs

এই জাতীয় মেশিনগুলি বিরল, তবে সি স্ট্যান্ডার্ড দ্বারা অনুমোদিত। এবং কিছু সি সংকলক কোড অপ্টিমাইজ করার জন্য টাইপ-পাণ্ডড পয়েন্টারগুলিকে পৃথক হিসাবে বিবেচনা করার অনুমতি গ্রহণ করে। পয়েন্টার এলিয়াসিংয়ের ঝুঁকি কোডটি অনুকূলকরণের একটি সংকলকের ক্ষমতার একটি প্রধান সীমাবদ্ধতা, তাই সংকলকগণ এই জাতীয় অনুমতিগুলির সুবিধা গ্রহণ করার ঝোঁক।

একটি সংকলক নিখরচায় আপনাকে বলতে পারে যে আপনি কিছু ভুল করছেন বা চুপচাপ আপনি যা চাননি তা করতে পারেন বা চুপচাপ আপনি যা চান তা করতে পারেন। অপরিজ্ঞাত আচরণ এগুলির যে কোনও একটিকে মঞ্জুরি দেয়।

আপনি freefuncএকটি ম্যাক্রো করতে পারেন :

#define FREE_SINGLE_REFERENCE(p) (free(p), (p) = NULL)

এটি ম্যাক্রোগুলির স্বাভাবিক সীমাবদ্ধতার সাথে আসে: ধরণের সুরক্ষার অভাব, pদুবার মূল্যায়ন করা হয়। নোট করুন যে এটি কেবলমাত্র যদি pঅবমুক্ত বস্তুর একক পয়েন্টার হয় তবে চারপাশে ঝুঁকির পয়েন্টার না রেখে নিরাপত্তা দেয় ।


1
এবং এটা ভালো জানি এমনকি যদি করতে Foo*এবং void*আপনার সিস্টেমের আর্কিটেকচারের একই উপস্থাপনা আছে, এটি এখনও undefined এর করতে টাইপ করুন-শ্লেষ তাদের।
তাভিয়ান বার্নেস

12

একটি void *অংশে সি মান দ্বারা বিশেষভাবে চিকিত্সা এটা একটি অসম্পূর্ণ টাইপ রেফারেন্স থাকার কারণে হয়। এই চিকিত্সা নেই না প্রসারিত void **যেমন করে , একটি সম্পূর্ণ টাইপ বিন্দু বিশেষভাবে void *

কঠোর অ্যালাইজিং বিধিগুলি বলে যে আপনি এক ধরণের পয়েন্টারকে অন্য প্রকারের পয়েন্টারে রূপান্তর করতে পারবেন না এবং পরবর্তীকালে সেই পয়েন্টারটিকে অবলম্বন করতে পারবেন কারণ এমনটি করার অর্থ একটি প্রকারের বাইটকে অন্য হিসাবে ব্যাখ্যা করা। কেবলমাত্র ব্যতিক্রম হ'ল কোনও চরিত্রের ধরণে রূপান্তর করার সময় যা আপনাকে কোনও অবজেক্টের উপস্থাপনা পড়তে দেয়।

আপনি কোনও ফাংশনের পরিবর্তে ফাংশনের মতো ম্যাক্রো ব্যবহার করে এই সীমাবদ্ধতাটি পেতে পারেন:

#define freeFunc(obj) (free(obj), (obj) = NULL)

যাকে আপনি এভাবে কল করতে পারেন:

freeFunc(f);

তবে এর কোনও সীমাবদ্ধতা নেই কারণ উপরের ম্যাক্রো objদুবার মূল্যায়ন করবে । আপনি যদি জিসিসি ব্যবহার করেন তবে কিছু এক্সটেনশন, বিশেষত typeofকীওয়ার্ড এবং বিবৃতি প্রকাশের সাথে এড়ানো যেতে পারে :

#define freeFunc(obj) ({ typeof (&(obj)) ptr = &(obj); free(*ptr); *ptr = NULL; })

3
উদ্দেশ্যে করা আচরণটির আরও ভাল প্রয়োগের জন্য +1। আমি কেবলমাত্র সমস্যাটিই দেখি তা #defineহ'ল এটি objদুবার মূল্যায়ন করবে । যদিও এটি দ্বিতীয় মূল্যায়ন এড়ানোর কোনও ভাল উপায় আমি জানি না। এমনকি একটি বিবৃতি প্রকাশ (জিএনইউ এক্সটেনশন) objআপনি এর মানটি ব্যবহার করার পরে আপনাকে যেভাবে ট্র্যাক করতে হবে তা চালাবে না ।
মাস্টার -

2
@cmaster: আপনি এই ধরনের বিবৃতি এক্সপ্রেশন হিসাবে গনুহ এক্সটেনশন ব্যবহার করতে ইচ্ছুক হন, তাহলে, তারপর আপনি ব্যবহার করতে পারেন typeofমূল্যায়নের এড়াতে objদুইবার: #define freeFunc(obj) ({ typeof(&(obj)) ptr = &(obj); free(*ptr); *ptr = NULL; })
রুখ

@রুখ খুব শীতল :-) দুর্দান্ত হবে যদি ডুবুশ উত্তরে এটিকে সম্পাদনা করে, তাই মন্তব্যে এটি ভর-মুছে ফেলা হবে না।
মাস্টার -

9

কোনও ধরণের পাউন্ড পয়েন্টারকে ডিফারেন্স করা হ'ল ইউবি এবং কী ঘটবে তা আপনি বিশ্বাস করতে পারবেন না।

বিভিন্ন সংকলক বিভিন্ন সতর্কতা উত্পন্ন করে এবং এই উদ্দেশ্যে একই সংকলকটির বিভিন্ন সংস্করণ বিভিন্ন সংকলক হিসাবে বিবেচনা করা যেতে পারে। এটি আর্কিটেকচারের উপর নির্ভরতার চেয়ে পরিবর্তিত পরিবর্তনের জন্য আরও ভাল ব্যাখ্যা বলে মনে হচ্ছে।

একটি ক্ষেত্রে যা আপনাকে এই ক্ষেত্রে টাইপ পেন্টিং খারাপ হতে পারে তা বুঝতে সহায়তা করতে পারে এটি হ'ল আপনার ফাংশন কোনও স্থাপত্যে কাজ করবে না sizeof(Foo*) != sizeof(void*)। এটি স্ট্যান্ডার্ড দ্বারা অনুমোদিত যদিও আমি কোনও বর্তমানকে জানি না যার জন্য এটি সত্য।

একটি কার্যপ্রণালী হ'ল কোনও ফাংশনের পরিবর্তে ম্যাক্রো ব্যবহার করা।

নোট freeপয়েন্টার গ্রহণ করে তা নোট করুন ।


2
আকর্ষনীয় এটি সম্ভব যে sizeof Foo* != sizeof void*। আমি "বুনোতে" পয়েন্টার আকারগুলি টাইপ নির্ভরশীল হওয়ার মুখোমুখি হই নি, তাই কয়েক বছর ধরে, আমি এটিকে স্বতঃস্ফূর্তভাবে বিবেচনা করতে এসেছি যে কোনও নির্দিষ্ট আর্কিটেকচারে পয়েন্টার আকারগুলি একই রকম।
স্টোনথ্রো

1
@ স্টোনথ্রো স্ট্যান্ডার্ড উদাহরণটি হ'ল ফ্যাড পয়েন্টার যা শব্দ ঠিকানার আর্কিটেকচারে বাইটগুলি সম্বোধন করতে ব্যবহৃত হয়। তবে আমি মনে করি বর্তমান শব্দ ঠিকানাযোগ্য মেশিনগুলি বিকল্প আকারের চর == আকারের শব্দের ব্যবহার করে ।
এপ্রোগ্রামার

2
নোট করুন যে প্রকারটি আকারের জন্য প্রথম বন্ধনীতে আবদ্ধ হতে হবে ...
অ্যান্টি হাপালা

@ স্টোনথ্রো: পয়েন্টার আকারগুলি নির্বিশেষে, টাইপ-ভিত্তিক উপন্যাস বিশ্লেষণ এটিকে অনিরাপদ করে তোলে; এটি কম্পাইলারদের এটি ধরে ধরে অনুকূলিত করতে সহায়তা করে যে কোনও স্টোরের মাধ্যমে কোনও float*কোনও int32_tউপাদান কোনও সংশোধন int32_t*করে না , সুতরাং উদাহরণস্বরূপ কোনও int32_t *restrict ptrসংকলকটিকে এটি একই স্মৃতিতে নির্দেশ করছে না এমন ধারণা করার দরকার নেই । স্টোরগুলির জন্য একই ধরণের void**একটি Foo*অবজেক্টটি সংশোধন না করা বলে ধরে নেওয়া হচ্ছে ।
পিটার

4

এই কোডটি সি স্ট্যান্ডার্ড অনুযায়ী অবৈধ, সুতরাং এটি কিছু ক্ষেত্রে কার্যকর হতে পারে তবে অগত্যা বহনযোগ্য নয়।

ভিন্ন পয়েন্টার প্রকারে ফেলে দেওয়া পয়েন্টারের মাধ্যমে কোনও মান অ্যাক্সেসের জন্য "কঠোর আলিয়াজিং বিধি" 6.5 অনুচ্ছেদে পাওয়া যায়:

একটি অবজেক্টের তার সঞ্চিত মানটি কেবলমাত্র একটি মূল্যবান এক্সপ্রেশন দ্বারা অ্যাক্সেস করতে হবে যার নিম্নলিখিত ধরণের একটি রয়েছে:

  • বস্তুর কার্যকর ধরণের সাথে সামঞ্জস্যপূর্ণ এক প্রকার,

  • বস্তুর কার্যকর ধরণের সাথে সামঞ্জস্যপূর্ণ কোনও ধরণের একটি যোগ্য সংস্করণ,

  • এমন এক ধরণের যা বস্তুর কার্যকর ধরণের সাথে সম্পর্কিত স্বাক্ষরযুক্ত বা স্বাক্ষরযুক্ত প্রকার,

  • এমন এক ধরণের যা বস্তুর কার্যকর ধরণের কার্যকর সংস্করণের সাথে সম্পর্কিত স্বাক্ষরযুক্ত বা স্বাক্ষরযুক্ত প্রকার,

  • একটি সামগ্রিক বা ইউনিয়ন প্রকার যা এর সদস্যদের মধ্যে পূর্বোক্ত ধরণের একটি অন্তর্ভুক্ত করে (অন্তর্ভুক্ত, পুনরাবৃত্তভাবে, একটি সাবগ্রেগেটের সদস্য বা সমন্বিত ইউনিয়নের সদস্য সহ), বা

  • একটি অক্ষর টাইপ।

আপনার *obj = NULL;বিবৃতিতে, অবজেক্টটির কার্যকর ধরণ রয়েছে Foo*তবে *objপ্রকারের সাথে লভ্যু এক্সপ্রেশন দ্বারা অ্যাক্সেস করা হয় void*

6.7.5.1 অনুচ্ছেদে 2, আমাদের আছে

দুটি পয়েন্টার ধরণের সামঞ্জস্যপূর্ণ হওয়ার জন্য, উভয়ই স্বতন্ত্রভাবে যোগ্য হবে এবং উভয়ই সামঞ্জস্যপূর্ণ ধরণের পয়েন্টার হতে হবে।

সুতরাং void*এবং Foo*কোয়ালিফায়ারগুলির সাথে সামঞ্জস্যপূর্ণ প্রকারগুলি বা সামঞ্জস্যপূর্ণ প্রকারগুলি নয় এবং অবশ্যই কঠোর আলিয়াজিং নিয়মের অন্য কোনও বিকল্পের সাথে খাপ খায় না।

কোডটি অবৈধ হওয়ার কারিগরি কারণ না হলেও এটি section.২.৫ অনুচ্ছেদ ২ note নোটের সাথেও প্রাসঙ্গিক:

একটি পয়েন্টারের voidএকটি চরিত্রের ধরণের পয়েন্টার হিসাবে একই উপস্থাপনা এবং প্রান্তিককরণের প্রয়োজনীয়তা থাকতে হবে। একইভাবে, সামঞ্জস্যপূর্ণ প্রকারের যোগ্য বা অযোগ্য সংস্করণগুলিতে পয়েন্টারগুলির একই প্রতিনিধিত্ব এবং প্রান্তিককরণের প্রয়োজনীয়তা থাকতে হবে। কাঠামোর ধরণের সমস্ত পয়েন্টারের একে অপরের মতো প্রতিনিধিত্ব এবং প্রান্তিককরণের প্রয়োজনীয়তা থাকতে হবে। ইউনিয়নের ধরণের সমস্ত পয়েন্টারগুলির একে অপরের মতো প্রতিনিধিত্ব এবং প্রান্তিককরণের প্রয়োজনীয়তা থাকতে হবে। অন্যান্য ধরণের পয়েন্টারগুলির একই প্রতিনিধিত্ব বা প্রান্তিককরণের প্রয়োজনীয়তা থাকা দরকার না।

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


2

অন্যান্য উত্তরগুলি যা বলেছে তার উপরে, এটি একটি ক্লাসিক অ্যান্টি-প্যাটার্ন সি এর এবং যা আগুনে পোড়া উচিত। এটি উপস্থিত:

  1. আপনি যেমন সতর্কতা পেয়েছেন তার মতো ফ্রি-অ্যান্ড-নাল-আউট ফাংশন।
  2. বরাদ্দকরণের ক্রিয়াকলাপগুলি যা প্রত্যাবর্তনের স্ট্যান্ডার্ড সি আইডিয়মকে দূরে রাখে void *(যা এই ধরণের সমস্যায় পড়ে না কারণ এটি টাইপ পেনিংয়ের পরিবর্তে মান রূপান্তর জড়িত ) পরিবর্তে একটি ত্রুটি পতাকা ফেরত পাঠানো এবং পয়েন্টার-টু-পয়েন্টারের মাধ্যমে ফলাফল সংরক্ষণ করে।

(1) এর অন্য উদাহরণের জন্য, ffmpeg / libavcodec এর একটি দীর্ঘকালীন কুখ্যাত মামলা ছিল av_free কার্যক্রমেআমি বিশ্বাস করি এটি শেষ পর্যন্ত ম্যাক্রো বা অন্য কোনও কৌশল দ্বারা স্থির হয়েছিল তবে আমি নিশ্চিত নই।

(2) এর জন্য cudaMallocএবং উভয়ইposix_memalign এর উদাহরণ।

উভয় ক্ষেত্রেই ইন্টারফেসের অন্তর্নিহিতভাবে অবৈধ ব্যবহারের প্রয়োজন হয় না , তবে এটি দৃ strongly়ভাবে উত্সাহিত করে, এবং কেবলমাত্র একটি অতিরিক্ত অস্থায়ী অবজেক্টের সাথে সঠিক ব্যবহারকে স্বীকার করে void *যা নিখরচায় এবং নাল-আউট কার্যকারিতার উদ্দেশ্যকে পরাস্ত করে এবং বরাদ্দকে আরও বিশ্রী করে তোলে।


(1) একটি বিরোধী-নিদর্শন কেন তা সম্পর্কে আরও ব্যাখ্যা করার জন্য আপনার একটি লিঙ্ক রয়েছে? আমি মনে করি না আমি এই পরিস্থিতি / যুক্তির সাথে পরিচিত এবং আরও শিখতে চাই।
স্টোনথ্রো

1
@ স্টোনথ্রো: এটি সত্যিই সহজ - উদ্দেশ্যটি হ'ল মুক্ত হওয়া স্মৃতিটিতে পয়েন্টারটি স্টোর করে অবজেক্টটি বাতিল করে অপব্যবহার রোধ করা হবে, তবে কলার আসলে কোনও উপায়ের মধ্যে যদি পয়েন্টারটি পয়েন্টারটি স্টোর করে তবে কেবল এটিই করতে পারে is এটি টাইপ করুন void *এবং কাস্টিং / রূপান্তর করুন এটি প্রতিবারই এটির নিকটস্থ করতে চায়। এটি খুব অসম্ভব। যদি কলার অন্য কোনও ধরণের পয়েন্টার সঞ্চয় করে থাকে, তবে ইউবির সাহায্য না করে ফাংশনটি কল করার একমাত্র উপায় হ'ল পয়েন্টারটিকে কোনও সাময়িক বস্তুর কাছে অনুলিপি করা void *এবং সেই ঠিকানাটি খালি ফাংশনে প্রেরণ করা এবং তারপরে এটি ঠিক ...
আর .. গীটহাব বন্ধ করুন ICE

1
... কলারের কাছে পয়েন্টারটি ছিল এমন আসল সঞ্চয়স্থানের চেয়ে একটি অস্থায়ী বস্তুকে নালার দিকে ঠেলে দেয়। অবশ্যই আসলে যা ঘটে তা হ'ল ফাংশনের ব্যবহারকারীরা একটি (void **)কাস্ট করে শেষ করে, নির্ধারিত আচরণ তৈরি করে।
আর .. গীটহাব বন্ধ হেল্পিং আইসিসি

2

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

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

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