ฉันกำลังอ่าน "คิดใน C ++" และมันเพิ่งเปิดตัวการextern
ประกาศ ตัวอย่างเช่น:
extern int x;
extern float y;
ฉันคิดว่าฉันเข้าใจความหมาย (ประกาศโดยไม่มีคำจำกัดความ) แต่ฉันสงสัยว่ามันจะมีประโยชน์เมื่อใด
บางคนสามารถให้ตัวอย่างได้หรือไม่?
ฉันกำลังอ่าน "คิดใน C ++" และมันเพิ่งเปิดตัวการextern
ประกาศ ตัวอย่างเช่น:
extern int x;
extern float y;
ฉันคิดว่าฉันเข้าใจความหมาย (ประกาศโดยไม่มีคำจำกัดความ) แต่ฉันสงสัยว่ามันจะมีประโยชน์เมื่อใด
บางคนสามารถให้ตัวอย่างได้หรือไม่?
คำตอบ:
สิ่งนี้มีประโยชน์เมื่อคุณมีตัวแปรส่วนกลาง คุณประกาศการมีอยู่ของตัวแปรโกลบอลในส่วนหัวเพื่อให้ไฟล์ต้นฉบับแต่ละไฟล์ที่มีส่วนหัวรู้เกี่ยวกับมัน แต่คุณจะต้อง "กำหนด" มันหนึ่งครั้งในหนึ่งในไฟล์ต้นฉบับของคุณ
ชี้แจงโดยใช้extern int x;
บอกคอมไพเลอร์ที่ว่าวัตถุของการพิมพ์ที่int
เรียกว่าx
อยู่ที่ไหนสักแห่ง มันไม่ใช่งานของคอมไพเลอร์ที่จะรู้ว่ามันอยู่ที่ไหนมันแค่ต้องรู้ประเภทและชื่อเพื่อที่จะรู้วิธีใช้มัน เมื่อรวบรวมไฟล์ต้นฉบับทั้งหมดแล้วตัวเชื่อมโยงจะแก้ไขการอ้างอิงทั้งหมดของx
คำจำกัดความเดียวที่พบในไฟล์ต้นฉบับที่รวบรวม เพื่อให้ทำงานได้คำจำกัดความของx
ตัวแปรจำเป็นต้องมีสิ่งที่เรียกว่า "การเชื่อมโยงภายนอก" ซึ่งโดยทั่วไปหมายความว่ามันจะต้องประกาศนอกฟังก์ชั่น (ที่มักเรียกว่า "ขอบเขตไฟล์") และไม่มีstatic
คำหลัก
#ifndef HEADER_H
#define HEADER_H
// any source file that includes this will be able to use "global_x"
extern int global_x;
void print_global_x();
#endif
#include "header.h"
// since global_x still needs to be defined somewhere,
// we define it (for example) in this source file
int global_x;
int main()
{
//set global_x here:
global_x = 5;
print_global_x();
}
#include <iostream>
#include "header.h"
void print_global_x()
{
//print global_x here:
std::cout << global_x << std::endl;
}
มันจะมีประโยชน์เมื่อคุณแชร์ตัวแปรระหว่างโมดูลสองสามตัว คุณกำหนดไว้ในโมดูลหนึ่งและใช้ภายนอกในโมดูลอื่น
ตัวอย่างเช่น:
ใน file1.cpp:
int global_int = 1;
ใน file2.cpp:
extern int global_int;
//in some function
cout << "global_int = " << global_int;
global_int
อยู่ใน namespace ทั่วโลก, ถ้าฉันจะใช้มันใน file2.cpp ในบางส่วนของ namespace ฉันจะต้องกำหนดขอบเขตให้ถูกต้องหรือไม่? ienamespace XYZ{ void foo(){ ::global_int++ } };
abc.h
abc.cpp
IDE ที่ดีจะช่วยได้ตลอดเวลา แต่รหัสที่มีการจัดระเบียบอย่างดีจะเป็นทางออกที่ดีกว่าเสมอ
extern
ใน file2.cpp ยังคงสามารถเข้าถึงglobal_int
หลังจากรวม ทำไมฉันต้องมีมัน
มันคือทั้งหมดที่เกี่ยวกับการเชื่อมโยง
คำตอบก่อนหน้านี้มีให้ explainations extern
ที่ดีเกี่ยวกับ
แต่ฉันต้องการเพิ่มจุดสำคัญ
คุณถามเกี่ยวกับextern
ในC ++ไม่ใช่ในCและฉันไม่รู้ว่าทำไมไม่มีคำตอบที่กล่าวถึงกรณีและปัญหาเมื่อextern
มาconst
ใน C ++
ใน C ++ const
ตัวแปรจะมีการเชื่อมโยงภายในโดยค่าเริ่มต้น (ไม่เหมือน C)
ดังนั้นสถานการณ์นี้จะนำไปสู่ข้อผิดพลาดในการเชื่อมโยง :
ที่มา 1:
const int global = 255; //wrong way to make a definition of global const variable in C++
ที่มา 2:
extern const int global; //declaration
ต้องเป็นเช่นนี้:
ที่มา 1:
extern const int global = 255; //a definition of global const variable in C++
ที่มา 2:
extern const int global; //declaration
extern
คำจำกัดความหรือไม่? คุณสามารถทำได้โดยพิมพ์ค่าของglobal
แหล่ง 2
extern
const int global = 255;
สิ่งนี้มีประโยชน์เมื่อคุณต้องการมีตัวแปรโกลบอล คุณกำหนดตัวแปรโกลบอลในไฟล์ต้นฉบับบางไฟล์และประกาศภายนอกในไฟล์ส่วนหัวเพื่อให้ไฟล์ใด ๆ ที่มีไฟล์ส่วนหัวนั้นจะเห็นตัวแปรโกลบอลเดียวกัน
extern
หลายครั้ง เครื่องมือของ Microsoft สร้างข้อผิดพลาดในการเชื่อมโยงสำหรับสัญลักษณ์ที่หายไปเมื่อกำหนดตารางในไฟล์ต้นฉบับอื่นแล้วเท่านั้น ปัญหาคือตารางconst
และคอมไพเลอร์ C ++ เลื่อนไปที่static
ในหน่วยการแปล ดูตัวอย่างเช่น, และariatab.cpp
kalynatab.cpp