অকার্যকর * ফাংশন () ফাংশনটির পয়েন্টার বা কোনও ফাংশন শূন্য * করে?


26

আমি এর অর্থ সম্পর্কে বিভ্রান্ত void *function()
এটি কি ফাংশনটির নির্দেশক বা কোনও ফাংশন ফিরছে void*? আমি এটি সর্বদা ডেটা স্ট্রাকচারে পয়েন্টার ফিরিয়ে দেওয়ার জন্য পুনরাবৃত্ত ফাংশন হিসাবে ব্যবহার করেছি, কিন্তু যখন আমি মাল্টিথ্রেডিংয়ে একটি কোড দেখেছি ( pthread) তখন একই ফাংশন ডিক্লেয়ারেশন রয়েছে। এখন আমি বিভ্রান্ত হয়ে পড়েছি যে তাদের মধ্যে পার্থক্য কী।


5
@ গুডভিবারেশন সি বিন্যাস-মুক্ত করা হয়েছে (এবং সি ++ "এটি উত্তরাধিকার সূত্রে প্রাপ্ত)। এমনকি void*function();সিনথেটিকভাবে সঠিক। উদাহরণস্বরূপ পাইথনের জন্য তারা একটি আলাদা সিদ্ধান্ত বেছে নিয়েছিল - বিন্যাসটি সিনট্যাক্সের অংশ। আইএমএইচও, উভয় উপায়ে এর প্রো এবং কনস রয়েছে।
শেফ

3
@ গুডবাইব্রেশন যত বেশি প্রোগ্রামারকে তারা যা করতে চায় তার থেকে আরও রক্ষা করার চেষ্টা করবেন যতটা আপনি জাভা জাতীয় কিছু পান;)
আইডাক্ল্যাভ 463035818

2
@ গুডভিবারেশন কম বিকল্প, কম নমনীয়তা। এবং, দয়া করে মনে রাখবেন কয়েক দশক আগে যখন তারা এটি করেছে। এরপরে অভিযোগ করা সহজ ... ...-)
শেফ

2
সি ভাষায়, void *function()এমন একটি ফাংশন যা একটি স্বেচ্ছাসেবী আর্গুমেন্ট গ্রহণ করে এবং একটি মান ফিরিয়ে দেয়, যখন অবজ্ঞাপিত হয়, টাইপ বাতিল হয় । সি ++ এ, void* function()এমন কোনও ফাংশন যা কোনও যুক্তি না নিয়ে এবং পয়েন্টার-টু-অকার্যকর মানটি প্রদান করে । আপনি কোন ভাষা সম্পর্কে জিজ্ঞাসা করছেন সে বিষয়ে আপনার মন তৈরি করা উচিত।
স্টিফেন এম ওয়েব 18

1
@ স্টিফেনএম.ওয়েব আপনিvoid * এটিকে অবজ্ঞা করতে পারবেন না । সর্বোপরি, যদি আপনি পারতেন তবে আপনি কী করবেন void?
ফ্যাবিও মনিকাকে

উত্তর:


38

ফাংশনটির রিটার্ন টাইপ থাকে void *

void *function();

সুতরাং আমি সর্বদা *এই জাতীয় ফাংশন নাম থেকে প্রতীক পৃথক ক্ষেত্রে পছন্দ

void * function();

এবং Jarod42একটি মন্তব্যে নির্দেশিত হিসাবে আপনি ট্রিলিং রিটার্ন টাইপ ব্যবহার করে সি ++ এ ফাংশন ঘোষণাকে আবার লিখতে পারেন

auto function() -> void *;

আপনি যদি কাজ করতে কোনও পয়েন্টার ঘোষণা করতে চান তবে আপনার লেখা উচিত

void ( *function )();

অথবা

void * ( *function )();

অথবা ফাংশনটির জন্য একটি পয়েন্টার যা পয়েন্টারকে ফাংশনে প্রত্যাবর্তন করে

void * ( *( *function )() )();

2
সে কারণেই আমি লিখতে পছন্দ করি void* function();। এটি তেমন লোভনীয় নয় ... ;-) (এটি লেখার সময় সম্পাদনাটি ঘটেছিল))
শেফ

কোডে আমি ঘোষণা করছি void * reader();তারপর pthread_create(&thread1,null,reader,reader_arg)পরিবর্তেpthread_create(&thread1,null,&reader,reader_arg)
user9515151

1
@ শেফ: বা এমনকি auto function() -> void*(সি ++)। :)
Jarod42

3
বা ফাংশনটির জন্য একটি পয়েন্টার যা ফাংশনটিতে পয়েন্টারটি ফেরত দেয় সেটাই typedef... ...-) এর জন্য
অ্যান্ড্রু হেনেল

1
@ অ্যান্ড্রুহেনেল টাইপডেফের সাথে আমাদের কোনও সমস্যা নেই। টাইপিডেফ বা উপন্যাসের ঘোষণা ছাড়াই ঘোষণাপত্র ব্যবহার করা হলে একটি সমস্যা দেখা দেয় :) :)
মস্কো থেকে

7

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

উদাহরণস্বরূপ, আমি আপনার উদাহরণটি ইনপুট করি void *foo()এবং এটি ফিরে আসে

অকার্যকর ফাংশন রিটার্নিং পয়েন্টার হিসাবে foo ঘোষণা

অন্যান্য বাক্য গঠনটি দেখতে কেমন তা দেখার জন্য, আমি ইনপুট দিই declare foo as pointer to function returning voidএবং এটি ফিরে আসল

অকার্যকর (* ফু) ()

এটি বিশেষভাবে কার্যকর হয় যখন আপনার একক অভিব্যক্তিতে একাধিক স্তরের টাইপকাস্ট, তারা বা বন্ধনী থাকে।


2

এটি একটি ফাংশন যা একটি পয়েন্টার ফেরত দেয় void

আপনার ঘোষণার বিষয়টি এভাবে চিন্তা করুন:

void *(function());

এটি ফাংশন রিটার্ন হবে void(বা কিছুই নয়):

void (*function2)();

উপরোক্ত ঘোষণাটি এইভাবে ভাবুন:

void ((*function2)());

এগুলি লেখার একটি খুব সহজ উপায় হ'ল typedef:

typedef void *function_returning_void_pointer();
typedef void function_returning_nothing();

function_returning_void_pointer function;
function_returning_nothing *function2;

এটি সাধারণত ফাংশন পয়েন্টারগুলির চারপাশে বিভ্রান্তি দূর করে এবং পড়তে খুব সহজ।


0

সি / সি ++ এ ঘোষণাগুলি অপারেটর নজির অনুসরণ করে সনাক্তকারী থেকে বাইরের দিকে পড়া হয় ।

উইকিপিডিয়ায় সি / সি ++ অপারেটর অগ্রাধিকার টেবিলের এক তাত্ক্ষণিক দৃষ্টিভঙ্গি থেকে জানা যায় যে ফাংশন কল অপারেটরটি ()ইন্ডিরিশন অপারেটরের চেয়ে উচ্চতর প্রাধান্য পেয়েছে *। সুতরাং, আপনার ফাংশন ঘোষণাগুলি এইভাবে পড়ে:

  • শনাক্তকারী: শুরু functionহয়

  • function() কোন আর্গুমেন্ট লাগে না এমন একটি ফাংশন

  • void* function()এবং প্রদান a void*

এই সাধারণ নীতিটি অ্যারের ঘোষণাপত্রের সাথেও ধারণ করে (এর []চেয়েও বেশি অগ্রাধিকার রয়েছে *) এবং দুটিয়ের সংমিশ্রণ রয়েছে। সুতরাং

int *(*arr[42])();

হিসাবে পড়া হয়

  • arr হয়
  • arr[42] 42 উপাদানগুলির একটি অ্যারে যা
  • *arr[42] পয়েন্টার
  • (*arr[42])() কোন আর্গুমেন্ট গ্রহণ এবং যে ফাংশন
  • int *(*arr[42])()ফিরে a int*

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

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