อะไรจะ 'std :;' ทำใน c ++?


89

ฉันเพิ่งแก้ไขโค้ดบางส่วนและพบข้อบกพร่องที่มีอยู่แล้วในบรรทัดเดียวภายในฟังก์ชัน:

std:;string x = y;

โค้ดนี้ยังคงคอมไพล์และทำงานตามที่คาดไว้

คำจำกัดความของสตริงทำงานได้เนื่องจากไฟล์นี้using namespace std;ดังนั้นจึงstd::ไม่จำเป็นในตอนแรก

คำถามคือทำไมต้องstd:;รวบรวมและถ้ามีอะไรทำ?


1
@Xeo: using namespace std;เขากล่าวว่าในคำถามที่เขามี
Fred Larson

@ เฟรด: ดาร์ป! ส่วนนั้นไม่ได้ถูกทำเครื่องหมายเป็นรหัสดังนั้นฉันจึงมองข้ามไป :) อย่างไรก็ตามฉันยังคงต้องการชี้ไปที่คำถามนี้
Xeo

23
เหตุผลเดียวกับที่http://www.stackoverflow.comรวบรวม ...
Kerrek SB

20
อีกเหตุผลที่จะไม่ใช้using namespace std;:)
David Rodríguez - dribeas

@KerrekSB ที่เกิดขึ้นกับเพื่อนของฉันขณะเรียกดู reddit! ลิงค์กลายเป็นสิ่งนี้ : D
mmirzadeh

คำตอบ:


91

std:gotoป้ายที่ใช้งานได้เป็นเป้าหมายสำหรับมัน

ตามที่@Adam Rosenfield ระบุในความคิดเห็นมันเป็นชื่อป้ายกำกับตามกฎหมาย

C ++ 03 §6.1 / 1:

ป้ายกำกับมีพื้นที่ชื่อของตัวเองและไม่รบกวนตัวระบุอื่น ๆ


4
ป้ายกำกับ AFAIK มีพื้นที่ชื่อของตัวเองดังนั้นจึงไม่ขัดแย้งกับสิ่งอื่นใดนอกจากคำหลักหรือมาโครแน่นอน
rodrigo

11
C ++ 03 §6.1 / 1 ระบุว่า "ป้ายกำกับมีพื้นที่ชื่อของตัวเองและไม่รบกวนตัวระบุอื่น ๆ "
Adam Rosenfield

6.1 / 1: "ป้ายกำกับมีช่องว่างชื่อของตัวเองและไม่รบกวนตัวระบุอื่น ๆ "
John Dibling




2

คอมไพเลอร์จะบอกคุณว่าเกิดอะไรขึ้น:

#include <iostream>
using namespace std;
int main() {
  std:;cout << "Hello!" << std::endl;
}

ทั้ง gcc และ clang ให้คำเตือนที่ชัดเจน:

std.cpp:4:3: warning: unused label 'std' [-Wunused-label]
  std:;cout << "Hello!" << std::endl;
  ^~~~
1 warning generated.

นำออกไปจากเรื่องนี้: รวบรวมโค้ดของคุณโดยเปิดใช้คำเตือน (เช่น-Wall) เสมอ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.