ฉันได้รับข้อความนี้เมื่อรวบรวม C ++ บน gcc 4.3
error: ‘NULL’ was not declared in this scope
มันปรากฏขึ้นและหายไปและฉันไม่รู้ว่าทำไม ทำไม?
ขอบคุณ
ฉันได้รับข้อความนี้เมื่อรวบรวม C ++ บน gcc 4.3
error: ‘NULL’ was not declared in this scope
มันปรากฏขึ้นและหายไปและฉันไม่รู้ว่าทำไม ทำไม?
ขอบคุณ
คำตอบ:
NULL
ไม่ใช่คำหลัก เป็นตัวระบุที่กำหนดไว้ในส่วนหัวมาตรฐานบางส่วน คุณสามารถรวม
#include <cstddef>
ที่จะมีมันอยู่ในขอบเขตรวมถึงพื้นฐานอื่น ๆ std::size_t
บางอย่างเช่น
nullptr
คำหลักซึ่งเป็นคำหลักจริงและไม่จำเป็นต้องใช้#include
s ใด ๆ มัน typesafe NULL
ยังมีมากกว่า
GCC กำลังดำเนินการไปสู่ C ++ 11 ซึ่งอาจเป็นเหตุผลว่าทำไมคุณต้องรวมcstddefเพื่อใช้ค่าคงที่NULL วิธีที่แนะนำใน C ++ 11 คือการใช้คีย์เวิร์ด nullptrใหม่ซึ่งใช้งานใน GCC ตั้งแต่เวอร์ชัน 4.6 nullptrไม่สามารถแปลงเป็นชนิดอินทิกรัลได้โดยปริยายดังนั้นจึงสามารถใช้เพื่อแยกแยะการเรียกไปยังฟังก์ชันที่โอเวอร์โหลดสำหรับทั้งตัวชี้และชนิดอินทิกรัล:
void f(int x);
void f(void * ptr);
f(0); // Passes int 0.
f(nullptr); // Passes void * 0.
NULL
ไม่เคยมีคำหลักในตัว เป็นมาโครที่กำหนดไว้ในส่วนหัว C มาตรฐานหลายตัวรวมถึง<stddef.h>
(หรือ<cstddef>
) gcc "ก้าวสู่ C ++ 11" ส่งผลอย่างไร ฉันไม่เห็นอะไรเลยในคำถามที่บอกเป็นนัยว่าโค้ด (ที่มองไม่เห็น) คอมไพล์ด้วย gcc / g ++ เวอร์ชันก่อนหน้าหรือมาตรฐานภาษาเวอร์ชันก่อนหน้า
NULL
ไม่ใช่คำหลัก มันเป็นการแทนที่มาโครสำหรับ 0 และเข้ามาstddef.h
หรือcstddef
ฉันเชื่อ คุณไม่มี#included
ไฟล์ส่วนหัวที่เหมาะสมดังนั้น g ++ จึงมองNULL
ว่าเป็นชื่อตัวแปรทั่วไปและคุณยังไม่ได้ประกาศ
เพื่อตอบคำตอบอื่น ๆ : หากคุณใช้ C ++ 11 ให้ใช้nullptr
ซึ่งเป็นคีย์เวิร์ดที่หมายถึงตัวชี้โมฆะที่ชี้ไปที่โมฆะ (แทนNULL
ซึ่งไม่ใช่ประเภทตัวชี้)
NULL สามารถพบได้ใน:
#include <string.h>
String.h จะดึง NULL จากที่อื่น
คุณสามารถประกาศแมโคร NULL เพิ่มหลังจาก # ของคุณรวมถึง:
#define NULL 0
หรือ
#ifndef NULL
#define NULL 0
#endif
ไม่ ";" ท้ายคำแนะนำ ...