'Std :;' ne olurdu? c ++ 'da mı?


89

Yakın zamanda bazı kodları değiştiriyordum ve bir işlevin bir satırında önceden var olan bir hata buldum:

std:;string x = y;

Bu kod hala derleniyor ve beklendiği gibi çalışıyor.

Dize tanımı işe yarıyor çünkü bu dosya using namespace std;, bu yüzden std::ilk etapta gereksizdi.

Soru şu ki, neden std:;derleme yapılıyor ve bir şey varsa ne yapıyor?


1
@Xeo: Sahip olduğu soruda dedi using namespace std;.
Fred Larson

@Fred: Derp! Bu kısım kod olarak işaretlenmedi, bu yüzden onu gözden kaçırdım. :) Yine de bu soruya işaret etmek istiyorum .
Xeo

23
http://www.stackoverflow.com
Derlemekle

20
Kullanmamak için başka bir neden using namespace std;:)
David Rodríguez - dribeas

@KerrekSB Reddit'e göz atarken bir arkadaşımın başına geldi! Bağlantı olduğu ortaya çıktı bu D:
mmirzadeh

Yanıtlar:


91

std:hedef olarak kullanılabilen bir etikettir goto.

@Adam Rosenfield'ın bir yorumda işaret ettiği gibi , bu yasal bir etiket adıdır.

C ++ 03 §6.1 / 1:

Etiketlerin kendi ad alanları vardır ve diğer tanımlayıcılarla karışmazlar.


4
AFAIK etiketlerinin kendi ad alanları vardır, bu nedenle anahtar kelimeler veya makrolar dışında hiçbir şeyle çakışmazlar.
rodrigo

11
C ++ 03 §6.1 / 1, "Etiketlerin kendi ad boşlukları vardır ve diğer tanımlayıcılarla karışmazlar" diyor.
Adam Rosenfield

6.1 / 1: "Etiketlerin kendi ad alanları vardır ve diğer tanımlayıcılarla karışmazlar"
John Dibling

32

Bu bir etiket, ardından boş bir ifade ve ardından bir dizenin bildirimi gelir x.



8
(expression)std: (end of expression); (another expression)string x = y;

4
Dilbilgisi açısından, aslında a (label-)statement, değil expression.
GManNickG

2

Derleyici size neler olduğunu anlatır:

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

Hem gcc hem de clang oldukça açık bir uyarı verir:

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

Bu hikayeden çıkarım: Kodunuzu her zaman uyarılar etkinken derleyin (örneğin -Wall).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.