ত্রুটি: 'NULL' এই সুযোগে ঘোষণা করা হয়নি


119

জিসিসি ৪.৩-তে সি ++ সংকলন করার সময় আমি এই বার্তাটি পাই

error: NULL was not declared in this scope

এটি প্রদর্শিত হয় এবং অদৃশ্য হয়ে যায় এবং কেন জানি না। কেন?

ধন্যবাদ।


2
সম্ভবত আপনি বার্তাটি কোথা থেকে আসছে সেটির পরিধি NULL ঘোষণা করেন নি?
পল টমলিন 17

1
আপনার কমপক্ষে কোডের সম্পূর্ণ অংশটি পোস্ট করা উচিত যা ত্রুটি দিচ্ছে। অন্যথায় কেবল ত্রুটির স্ট্রিং দেখে কী ঘটছে তা বলা খুব কঠিন হবে।
নবীন

উত্তর:


178

NULLএকটি কীওয়ার্ড নয়। এটি কিছু স্ট্যান্ডার্ড শিরোনামে সংজ্ঞায়িত একটি শনাক্তকারী। আপনি অন্তর্ভুক্ত করতে পারেন

#include <cstddef>

এটিকে আরও কিছু বুনিয়াদি সহ, স্কোপে রাখার জন্য std::size_t


Godশ্বর, আমি জাভা দিয়ে নষ্ট হয়ে গেছি (মূল শব্দটি নাল হওয়া) যে আমি কখনই ভাবিনি যে সি ++ এর মধ্যে NULL একটি কীওয়ার্ড হবে না। ধন্যবাদ :)
স্টিফান হেন্ডরিক্স

14
আসলে এটি জাভাতে কোনও কীওয়ার্ড নয়।
ম্যান অফ ওয়ান ওয়ে

4
@ ম্যানোফওনওয়ে না, এটি জাভাতে রয়েছে, এটি মূলধনের পরিবর্তে সমস্ত ছোট হাতের অক্ষর দিয়ে বানান।
আতরাক্সিয়া

8
@ জিটাসুরো আমি বলিনি যে এটির অস্তিত্ব নেই। আমি কেবল বলেছি এটি কোনও কীওয়ার্ড নয়।
ম্যান অফ ওয়ান ওয়ে

8
এখন যেহেতু সি ++ 11 আরও সাধারণভাবে সংকলকগণ দ্বারা সমর্থিত, এটি মূলশব্দটি উল্লেখ করার মতো হতে পারে nullptr, যা একটি আসল কীওয়ার্ড এবং এর জন্য কোনও প্রয়োজন নেই #include। এটি এর চেয়েও বেশি টাইপসেফ NULL
টেম্পলেটটিফাইফ

38

জিসিসি সি ++ 11, সম্ভবত এই কারণেই আপনি এখন অন্তর্ভুক্ত করতে হবে পদক্ষেপ নিচ্ছে cstddef অর্ডার ব্যবহার করতে আপনাকে অবশ্যই শূন্য ধ্রুবক। সি ++ 11 এ পছন্দসই উপায় হ'ল নতুনটি ব্যবহার করা নলপ্টার কীওয়ার্ডটি , যা জিসিসিতে সংস্করণ ৪. since থেকে কার্যকর করা হয়েছে। নালপ্ট্রার ইন্টিগ্রাল টাইপগুলিতে স্পষ্টভাবে রূপান্তরিত হয় না, সুতরাং এটি কোনও ফাংশনটিতে কল কলহীন করতে ব্যবহার করা যেতে পারে যা পয়েন্টার এবং অবিচ্ছেদ্য উভয় প্রকারের জন্যই ওভারলোড করা হয়েছে:

void f(int x);
void f(void * ptr);

f(0);  // Passes int 0.
f(nullptr);  // Passes void * 0.

1
তবে তবুও এটি এক আজব আচরণ! এমনকি আমার কোডটি -std = c ++ 98 দিয়ে জাইসিসি স্টিল দিয়ে নকল ম্যাক্রোকে স্বীকৃতি দেয় না এবং এটি কেবল সি ++ 11 বা ননপ্লেটারকে -std এর জন্য আর্গুমেন্ট হিসাবে স্বীকৃতি দেয়।
ফেরাউন

2
সি ++ স্ট্যান্ডার্ড ইতিমধ্যে 1998 সালে জানিয়েছে যে সিআলডিডিএফ-তে NUL সংজ্ঞায়িত করা হয়েছে - নতুন সংকলক সংস্করণগুলি আরও কঠোরভাবে মানটিকে অনুসরণ করে কারণ তাদের নাল্পটার প্রয়োগ করতে হবে to আপনার (ত্রুটিযুক্ত) কোডটি পূর্ববর্তী জিসিসি সংস্করণগুলির সাথে সংকলন করেছে, তবে পূর্ববর্তী সি ++ স্ট্যান্ডার্ড সংস্করণগুলি ছাড়াও পূর্ববর্তী জিসিসি সংস্করণগুলির সাথে পশ্চাদপটে সামঞ্জস্য থাকা কঠিন হবে।
সেপ্পো এনারভি

NULLকখনও অন্তর্নির্মিত কীওয়ার্ড হয় নি; এটি <stddef.h>(বা <cstddef>) সহ বেশ কয়েকটি স্ট্যান্ডার্ড সি শিরোনামে সংজ্ঞায়িত ম্যাক্রো । জিসিসি "সি ++ 11 এর দিকে পদক্ষেপ গ্রহণ" কীভাবে এটিকে প্রভাবিত করে? আমি প্রশ্নের মধ্যে এমন কিছুই দেখতে পাচ্ছি যা বোঝায় যে (অদেখা) কোডটি জিসিসি / জি ++ এর পূর্ববর্তী সংস্করণগুলির সাথে বা ভাষার মানের পূর্ববর্তী সংস্করণগুলির সাথে সংকলিত হয়েছে।
কিথ থম্পসন

1
আমি উপরে যা বলেছিলাম ঠিক সেটাই: ইতিমধ্যে সি ++ 98 এ এটি সিএসডিডিএফ-এ সংজ্ঞায়িত করা হয়েছিল। তবুও জিসিসি (এবং অন্যান্য সংকলকগুলিও) স্বীকৃত কোড যা প্রথমে সিএসডিডিএফ অন্তর্ভুক্ত না করে NULL ব্যবহার করে। আমি পূর্ববর্তী সংস্করণগুলির সাথে প্রশ্নযুক্ত (অদেখা) কোডটিও যথেষ্ট নিশ্চিত, যদিও এটি কঠোরভাবে মান সম্মত নয়। এখন আমি কেবল অনুমান করছি যে আধুনিক সংস্করণগুলির এই কঠোর আচরণটি সি ++ 11 সিনট্যাক্স সমর্থন করার জন্য সংকলকটির বিকাশের কারণে।
সেপ্পো এনার্ভি

10

NULLএকটি কীওয়ার্ড নয়; এটি 0 এর জন্য ম্যাক্রো প্রতিস্থাপন এবং এটি আসে stddef.hবা হয় cstddef, আমি বিশ্বাস করি। আপনার কাছে #includedযথাযথ শিরোনামের ফাইল নেই, তাই g ++ NULLএকটি নিয়মিত ভেরিয়েবলের নাম হিসাবে দেখে এবং আপনি এটি ঘোষণা করেন নি।


5

অন্যান্য উত্তরগুলি পূরণ করতে: আপনি যদি সি ++ 11 ব্যবহার করেন তবে ব্যবহার করুন nullptrযা একটি কীওয়ার্ড যার অর্থ শূন্য পয়েন্টারটি নালার দিকে নির্দেশ করা। (পরিবর্তে NULL, যা পয়েন্টার ধরণের নয়)


0

NUL এছাড়াও পাওয়া যাবে:

#include <string.h>

স্ট্রিং.ইউ অন্য কোথাও থেকে নুলকে টানবে।


0

আপনি ম্যাক্রো নূলে ঘোষণা করতে পারেন। আপনার # অন্তর্ভুক্ত হওয়ার পরে এটি যুক্ত করুন:

#define NULL 0

অথবা

#ifndef NULL
#define NULL 0
#endif

না ";" নির্দেশাবলী শেষে ...

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