12
#include <iostream>
#include <string>
#include <cctype>

using std::string;
using std::cin;
using std::cout; using std::endl;

int main()
{
    string s("Hello World!!!");
    decltype(s.size()) punct_cnt = 0;
    for (auto c : s)
        if (ispunct(c))
            ++punct_cnt;
    cout << punct_cnt
         << " punctuation characters in " << s << endl;
}

or を宣言ispunct()せずに使用できるようですが、orを使用することはできません。なぜこうなった?std::using std::ispunct;std::coutstd::cin

4

3 に答える 3

3

C の名前 (C からヘッダーをインクルードして取得したもの) は、ヘッダーのバージョンをインクルードしている場合でも、名前xxx.h空間に加えてグローバル名前空間に含めることができます。これは、C++ 実装を提供するが C 実装を提供しない場合、グローバル名前空間にそれらがないことが問題になる可能性があるためです (したがって、実際の C ヘッダーは、制御しないコンパイラからのものです)。::stdcxxx

あなたの場合、ispunctヘッダーから来ますctype.h。ヘッダーをインクルードしている間、これにはグローバル名前空間でシンボルを宣言するヘッダーがcctypeインクルードされます。ctype.hispunct

于 2013-08-04T20:07:26.033 に答える