নাল কেন অঘোষিত?


87

আমি যখন এই কোডটি সংকলন করার চেষ্টা করি তখন এই স্ট্রাক্ট ঠিকাদারের সাথে আমার একটি সমস্যা আছে:

typedef struct Node
{
    Node( int data ) //
    {
        this->data = data;
        previous = NULL; // Compiler indicates here
        next = NULL;
    }

    int data;
    Node* previous;
    Node* next;
} NODE;

যখন আমি আসি তখন এই ত্রুটি ঘটে:

\linkedlist\linkedlist.h||In constructor `Node::Node(int)':|
\linkedlist\linkedlist.h|9|error: `NULL' was not declared in this scope|
    ||=== Build finished: 1 errors, 0 warnings ===|

শেষ সমস্যাটি কাঠামো ছিল, তবে এটি আমার মেইন সিপিপি-তে থাকাকালীন কাজ করেছিল, এবার এটি একটি শিরোনামের ফাইলে রয়েছে এবং আমাকে এই সমস্যা দিচ্ছে। আমি এই কোডটি সংকলন করতে কোড :: ব্লক ব্যবহার করছি

উত্তর:


139

NULLসি বা সি ++ ভাষায় অন্তর্নির্মিত ধ্রুবক নয়। আসলে, সি ++ এ এটি কমবেশি অপ্রচলিত, কেবল 0পরিবর্তে একটি সরল আক্ষরিক ব্যবহার করুন, সংকলক প্রসঙ্গের উপর নির্ভর করে সঠিক কাজটি করবে।

আরও নতুন সি ++ (সি ++ 11 এবং উচ্চতর) -এ, ব্যবহার করুন nullptr(একটি মন্তব্যে নির্দেশিত হিসাবে, ধন্যবাদ)।

অন্যথায়, যোগ করুন

#include <stddef.h>

NULLসংজ্ঞা পেতে ।


7
NULL stddef.h এর অংশ, stdlib.h নয়। প্রযুক্তিগতভাবে, আপনি এটি stdlib.h এর অংশ হিসাবে পাওয়ার গ্যারান্টিযুক্ত নন যদিও আমি স্বীকার করি আপনি এটি না করলে এটি বেশ চমকপ্রদ হবে।
সিবি বেইলি

8
NULL নিম্নলিখিত সি শিরোনামে সংজ্ঞায়িত করা হয়েছে: stddef.h, stdlib.h, stdio.h, লোকেল.h, স্ট্রিং।, এবং টাইম h (এবং যদি আপনি C99 গণনা করেন তবে wchar.h)।
মাইকেল বারার

8
<cstddef>ক্লিনার বিকল্প।
ফ্রেড ফু

30
"নুল" বলতে চাইলে "0" ব্যবহার করবেন না! একটা হল পার্থক্য : শব্দার্থবিদ্যা। কোনওটি কী তা জানার এবং সঠিক শব্দটি ব্যবহার করার গুরুত্বটিকে কখনই হ্রাস করবেন না, যদিও সংকলক আপনাকে এটিকে দূরে সরিয়ে দেয়!
imallett

13
@ 6502 সে সম্পর্কে কথা বলছে না; 0 এবং NUL এর সমান মান থাকে (প্রায়) সর্বদা, সুতরাং '\ 0' বা 0 ব্যবহার করে দুর্ঘটনাক্রমে কাজ হবে। সমস্যা শব্দার্থবিজ্ঞানের। NULL ব্যবহার করা আরও অভিব্যক্তিক, যেহেতু এটি বলে যে মান প্রশ্নটি কেবল একটি পূর্ণসংখ্যা নয় poin
imallett

35

নুল ব্যবহার করুন। এটি যাইহোক যাইহোক 0 হিসাবে সংজ্ঞায়িত এবং এটি পূর্ণসংখ্যা 0 থেকে শব্দার্থগতভাবে পৃথক করা খুব দরকারী।

0 ব্যবহার করে সমস্যা আছে (এবং সেইজন্য NULL)। উদাহরণ স্বরূপ:

void f(int);
void f(void*);

f(0); // Ambiguous. Calls f(int).

nullptrএটি ঠিক করার জন্য সি ++ (সি ++ 0 এক্স) এর পরবর্তী সংস্করণ অন্তর্ভুক্ত ।

f(nullptr); // Calls f(void*).

4
এটি ((void *)0)বেশিরভাগ সি স্ট্যান্ডার্ড লাইব্রেরি বাস্তবায়ন হিসাবে সংজ্ঞায়িত করা হয়।
ট্রায়ানগ

4
এটি সেরা সংক্ষিপ্ত উত্তর (এবং প্রযুক্তিগতভাবে সুনির্দিষ্ট) আমি এই বিষয়েটি পড়েছি: নুল বনাম 0 বনাম 0 নাল্প্ট্রার। ধন্যবাদ!
jose.angel.jimenez

4
@ সিপ্লাস ((void *)0)সি ++ এ ভুল, কারণ সি void*পয়েন্টের মতো অন্যান্য পয়েন্টার ধরণের ক্ষেত্রে যেমন জরুরী নয়, উদাহরণস্বরূপ, সংজ্ঞা দেওয়া হয় #define NULL 0তখন __cplusplusতা করে does
rpjohnst

16

NULLমূল সি ++ ভাষার একটি স্থানীয় অংশ নয়, তবে এটি স্ট্যান্ডার্ড লাইব্রেরির অংশ। আপনাকে একটি স্ট্যান্ডার্ড হেডার ফাইল অন্তর্ভুক্ত করতে হবে যা এর সংজ্ঞাটি অন্তর্ভুক্ত করে। #include <cstddef>বা #include <stddef.h>পর্যাপ্ত হতে হবে।

সংজ্ঞা NULLআপনি অন্তর্ভুক্ত নিশ্চিত করা হয় উপলব্ধ হতে cstddefবা stddef.h। এটির নিশ্চয়তা নেই তবে আপনি যদি এর পরিবর্তে অন্যান্য অনেক মানক শিরোনাম অন্তর্ভুক্ত করেন তবে আপনি সম্ভবত এর সংজ্ঞাটি অন্তর্ভুক্ত করতে পারবেন।


12

আপনি কি এই ফাইলটিতে "stdlib.h" বা "cstdlib" অন্তর্ভুক্ত করছেন? NULL stdlib.h / cstdlib এ সংজ্ঞায়িত করা হয়েছে

#include <stdlib.h>

বা

#include <cstdlib>  // This is preferrable for c++

4
শূন্য stdlib.h না stddef.h, অংশ
awiebe

@awiebe পাঁচ মিনিট আগে পর্যন্ত আমি যা ভেবেছিলাম - C99 অনুসারে বেশ কয়েকটি ভিন্ন শিরোনাম ফাইল এটির সংজ্ঞা দিতে হবে। বিভাগ 7.17 এর জন্য stddef.h প্রয়োজন, 7.20 এর stdlib.h এ প্রয়োজন, এবং সম্ভবত খুব ভাল কিছু আছে।
এজেএম-রিইনস্টেট-মনিকা

4

ব্যবহার করবেন না NULL, সি ++ এর 0পরিবর্তে অযত্ন ব্যবহার করতে পারবেন :

previous = 0;
next = 0;

এবং, সি ++ 11 এর মতো আপনার সাধারণত ব্যবহার করা উচিত নয় NULL বা 0 যেহেতু এটি আপনাকে nullptrটাইপ দেয় std::nullptr_tযা কার্যের পক্ষে আরও উপযুক্ত।


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

4
আমি অবশ্যই আপনার সাথে উভয়ের সাথে একমত ঘটনাচক্রে, এটি উভয়ই ভাল যে কোনও নথির মধ্যে একটি পয়েন্টার ব্যবহার করে, তবে এটির জন্য একটি ভাল নথিও সত্য যা কোনও পূর্ণসংখ্যাকে এগিয়ে রাখে। প্রিন্টফ ("% p \ n", NULL) বিবেচনা করুন; // ওএইচ, ইউবি। অথবা আপনার যদি দুটি ওভারলোড হয়, অকার্যকর চ (ইনট); অকার্যকর চ (শূন্য *); আপনি ভাবতে পারেন যে চ (নাল); কলটিতে তাত্ক্ষণিকভাবে নজর রাখার পরে শূন্য * সংস্করণকে কল করে। চ (0); এটি প্রকৃতপক্ষে সংস্করণটি কল করবে এটি নথিবদ্ধ করবে, তবে আপনি যে পয়েন্টারটি পাস করেছেন তা নথিভুক্ত করবেন না :( ভাল যে নাল্পটার এটি ঠিক করে দিয়েছে :)
জোহানেস শ্যাচ - লিটব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.