সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের এই উত্তর থেকে voidএটি কীভাবে ব্যবহৃত হবে তার উপর নির্ভর করে বিশেষভাবে চিকিত্সা করা হয়। ইন Cএবং C++, কোনও ডেটা টাইপের অনুপস্থিতিvoid নির্দেশ করতে ব্যবহৃত হয় , অন্যদিকে মেমোরিতে কিছু ডেটা / স্পেসvoid * নির্দেশ করে এমন পয়েন্টার নির্দেশ করতে ব্যবহৃত হয় যা টাইপ নেই। void *এটি নিজস্বভাবে ডিফারেন্স করা যায় না এবং প্রথমে অন্য কোনও ধরণের কাস্ট করতে হবে। এই castালাইটি সুস্পষ্ট হওয়ার দরকার নেই C, তবে এটি অবশ্যই স্পষ্ট হওয়া উচিত C++। (এই কারণেই আমরা মলোকের রিটার্ন মানটি কাস্ট করি না void *))
যখন প্যারামিটার হিসাবে কোনও ফাংশন ব্যবহার করা হয়, তার voidঅর্থ কোনও পরামিতিগুলির মোট অনুপস্থিতি এবং এটি কেবলমাত্র পরামিতি অনুমোদিত। একটি চলক টাইপের মতো শূন্যতা ব্যবহার করার চেষ্টা করা বা সংকলক ত্রুটির ফলে অন্যান্য যুক্তিগুলির ফলাফল অন্তর্ভুক্ত:
int foo(void, int); //trying to use "void" as a parameter
int bar(void baz); //trying to use "void" as an argument's type
main.c:1:8: error: 'void' must be the first and only parameter if specified
int foo(void, int);
^
main.c:2:14: error: argument may not have 'void' type
int bar(void baz);
^
টাইপের সাথে ভেরিয়েবল ঘোষণা করাও একইভাবে অসম্ভব void:
int main(void) {
void qux; //trying to create a variable with type void
}
main.c:5:8: error: variable has incomplete type 'void'
void qux;
voidকোনও ফাংশনের রিটার্ন মান কোনও ডেটা ফেরত আসবে না তা নির্দেশ করে। যেহেতু প্রকারের পরিবর্তনশীল ঘোষণা voidকরা অসম্ভব void, তাই একটি শূন্য পয়েন্টার সহ এমনকি কোনও ফাংশনের রিটার্ন মান ধরা অসম্ভব ।
void foo(int i) { return; }
int main(void) {
void *j;
j = foo(0);
return 0;
}
main.c:5:5: error: assigning to 'void *' from
incompatible type 'void'
j = foo(0);
^ ~~~~~~
টাইপলেস void *একটি পৃথক কেস। একটি অকার্যকর পয়েন্টার মেমরির কোনও অবস্থানের জন্য একটি পয়েন্টার নির্দেশ করে, তবে সেই পয়েন্টারে ডেটার ধরণটি নির্দেশ করে না। (এটি সিতে পলিমারফিজম অর্জনের জন্য ব্যবহৃত হয় , যেমন কিউসোর্ট () ফাংশন সহ ।) তবে এই পয়েন্টারগুলি ব্যবহার করা খুব কঠিন, তবে এগুলি ভুলভাবে ভুল প্রকারে ফেলে দেওয়া খুব সহজ। নীচের কোডটি কোনও সংকলক ত্রুটি এতে ফেলে দেবে না C, তবে অনির্ধারিত আচরণের ফলাফল:
#include <stdio.h>
int main(void) {
double foo = 47.2; //create a double
void *bar = &foo; //create a void pointer to that double
char *baz = bar; //create a char pointer from the void pointer, which
//is supposed to hold a double
fprintf(stdout, "%s\n", baz);
}
নিম্নলিখিত কোডটি তবে পুরোপুরি আইনী; একটি অকার্যকর পয়েন্টার থেকে এবং থেকে castালাই এটি ধারণ করা মানটি কখনই পরিবর্তন করে না।
#include <stdio.h>
int main(void) {
double foo = 47.2;
void *bar = &foo;
double *baz = bar;
fprintf(stdout, "%f\n", *baz);
}
47.200000
একটি ফাংশন প্যারামিটার হিসাবে, void *ইঙ্গিত দেয় যে আপনি যে পয়েন্টারে যাচ্ছেন তাতে যে ধরণের ডেটা রয়েছে তা জানা যায়নি এবং প্রোগ্রামার আপনাকে সেই মেমরির অবস্থানটিতে যা আছে তা সঠিকভাবে পরিচালনা করতে হবে। রিটার্ন মান হিসাবে, void *নির্দেশ করে যে ডেটা ফেরত আসার ধরনটি জানা নেই বা টাইপহীন নয় এবং অবশ্যই প্রোগ্রাম দ্বারা পরিচালনা করা উচিত।
int quux(void *); //a function that receives a pointer to data whose type is not known, and returns an int.
void *quuz(int); //a function that receives an int, and returns a pointer to data whose type is not known.
tl; dr void একটি ফাংশন প্রোটোটাইপের অর্থ "কোনও ডেটা নেই" এবং কোনও void *ফাংশন প্রোটোটাইপের অর্থ কোনও প্রকারের মান বা কোনও প্যারামিটার নির্দেশ করে না, "এই ফাংশনটিতে প্রদত্ত পয়েন্টারে থাকা ডেটাটির একটি পরিচিত প্রকার নেই" এবং একটি পরামিতি বা প্রত্যাবর্তনের মান নির্দেশ করে পয়েন্টারটিতে ডেটা ব্যবহার করার আগে যার পয়েন্টারটি অবশ্যই অন্য কোনও ধরণের কাস্ট করতে হবে।