2015-10-09 16 views
21

私のコードの1つの機能で、私はバグを発見しました。書かれたstd:stringstd:stringとstd :: stringの違い

const std::string currentDateTime() { 
    time_t  now = time(0); 
    struct tm tstruct; 
    char  buf[80]; 
    tstruct = *localtime(&now); 
    //strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct); 
    strftime(buf, sizeof(buf), "%Y%m%d%X", &tstruct); 

    std:string str = buf; 

    str.erase(std::remove(str.begin(), str.end(), ':'), str.end()); 
    return str; 
} 

コードはエラーの無い状態でコンパイルされます。なぜそれはコンパイルされますか?それではstd:stringはどういう意味ですか?

+9

'std:'はラベルであり、どこかで使用する必要があります。 –

+2

このコードは、 "using namespace std"を実行していて、IMOが悪い場合にのみ機能します。さもなければ定義されたタイプ文字列がない限り、これはコンパイルエラーとして捕らえられていました。 – Devolus

+2

@Devolus std :: stringを使って同じ効果を得ることもできます。 – dascandy

答えて

20

gotoで使用できるラベルとして解釈されます。

int main() 
{ 
    //label to jump to: 
    label_name: 
    //some code 
    <..> 
    //some code 
    goto label_name;//jump to the line with the lable 
} 

明らかにそれはタイプミスでした。上記のどこかでusing namespace std;またはusing std::stringが使用されたため、コードがコンパイルされました。それ以外の場合は、 "文字列はこのスコープで宣言されていません"というエラーが発生します。

6

私はそれが悪名高い"using namespace std;ので、コンパイルと思う「ディレクティブがファイルに上記で使用した(または悪化し、他の中のファイルを含む)。

ので、コンパイラが見る」goto文ラベルとして「std:を、そしてので(std::)stringを使用しています使用された「名前空間stdを使用して」

現代のコンパイラで通常

を警告、(gccの中)のようなものがあり:

warning: label ‘std’ defined but not used 
+1

この回答にはいくつかの問題がありますが、' using namespace std; 'はこれが出る唯一の方法ではありません。これについて警告します.OPにはVisual C++の質問タグが付けられています。警告は自動的にオンにする必要はありません。自動化されていれば、OPは問題を発見したことがあります。したがって、問題の根源は警告をオンにしていないということです。 –

5

std:はUされていますgotoのターゲットとして使用できるラベルとしてsedを使用します。

using namespace std; 

はまたWhy is “using namespace std;” considered bad practice?を参照してください。

using std::string; 

か:あなたのコードのいずれかにusing directiveどこかに存在する必要があります。

これは、警告を使用しての重要性を実証しています。 Visual Studio、gcc、clangを使って正しいフラグを使って警告します。このコードでは参照されていないラベル

警告C4102: 'STD' /W3を使用して、Visual Studioの次の警告(see it live)を与える

#include <string> 

using std::string ; 

int main() 
{ 
    std:string s1 ; 
} 
のgccについては

と私は以下を受け取るために、-Wallを使用してclangで十分でした:

warning: label 'std' defined but not used [-Wunused-label] 
std:string s1 ; 
^ 

などの警告と同様です。

関連する問題