C++にて下記のソースをVC++にてコンパイルすると「'string'定義させていない識別子です。」などどエラーがでてしまいます。BC++では何も問題ないのですが・・・。なぜなのでしょうか?

#include <iostream.h>
#include <string.h>

void main(){
string s;
cout << "貴方の名前は?" <<endl;
cin >> s;
cout << s <<"さん、こんにちは"<<endl;
}

A 回答 (3件)

> ご指摘の通りインクルードをしましたがwarnig C4530~というエラーが先のエラーと一緒にバーっとたくさんでてきてしまいます。



せっかくメッセージが出ているのだから、その内容を読んでみましょう。
-GX オプションを使え、と出ていますよね。
    • good
    • 0

ふたつのインクルードを以下のようにしてください



#include <iostream>
#include <string>

> VC++のコンパイラって古いのですか?

いえ、古い(とは、一概に言えないんですが)のは BC++ の方です。

string クラスが標準ライブラリに入ってきたのは、ANSI 以後ですが、ANSI の
規格では、c++ のインクルードファイルは、末尾の .h がつきません。

string.h は、C の文字列関数に絡むインクルードファイルで、その中に
string クラスが入っている BC++ の方が変です。

この回答への補足

再び回答ありがとうございます。
ご指摘の通りインクルードをしましたがwarnig C4530~というエラーが先のエラーと一緒にバーっとたくさんでてきてしまいます。
ん~!分かりません。こんがらがってきてます。

補足日時:2001/12/13 20:32
    • good
    • 0
この回答へのお礼

お礼というより補足になるのですが、先ほどご指摘の通り記述してVC++6.0上で試したところ、正常に表示されました。
がコマンド プロンプト上で「cl ファイル名.cpp」とコンパイルしようとすると先ほど言ったようなエラーでます。
コマンドプロンプト上ではコンパイルできないのでしょうか?
筋違いな質問ばかりしてすいません。

お礼日時:2001/12/13 20:57

using namespace std;



の一行を main() の前に入れてください。

因みに、void main() でコンパイルが通りますか?
C++ は、型にうるさい言語です。int main() としておいて、最後に return 0; しましょう。

この回答への補足

回答ありがとうございます。
using namespace std; を追加しても「'std':存在しないか名前空間ではありません。」と先のエラーに加えて表示されます。
int main()にしても同じです。
私が参考にしている本には質問欄に書いたとおりの記述がしてあります。
ちなみにBC++の場合はいずれの場合も問題なくコンパイルできます。
VC++でコンパイルする時のみこれらのエラーがでます。
VC++のコンパイラって古いのですか?
ちなみにVC++6.0です。

補足日時:2001/12/13 19:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

QC++ : cout << (数字) で実行時エラーが発生する理由

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}



---------------------------------------------------------


エラーの発生する部分ですが、数字ではなく文字・文字列なら問題なく表示されます。

このコードでは変数 length を表示しようとしていますが、length でなくても、またどのような『数』でも『この関数内』で cout を使用するとエラーが発生します。

この関数に何か間違いがあるのではないかと思うのですが、どうにも見つけることが出来ません。
コード全体はこの下に掲載します。

cout に何か制約があるのでしょうか。それとも、やはりコードのどこかに誤りがあるのでしょうか。わかる方がいましたら、解答お願いします。




全コード
------------------------------------------------------
#include <iostream>
#include <cstring>
using namespace std;

void rev_str(char *a);
void rev_str(const char *source, char *des);

int main()
{
char a[80], b[80];
strcpy(a, "hello, world!");
rev_str(a, b);
rev_str(a);
cout << a << "\n";
cout << b << "\n";

return 0;
}

void rev_str(char *a)
{
int length = 0;

cout << length;

while(true) {
if(*(a + length) == '\0') break;
length++;
}
for(int i = 0; i < length / 2; i++) {
char temp = a[i];
a[i] = a[length - i - 1];
a[length - i - 1] = temp;
}
}

void rev_str(const char *source, char *des)
{
char *a = (char*)malloc(sizeof(source));
strcpy(a, source);
rev_str(a);
strcpy(des, a);
free(a);
}

ある特定の位置でcout を用いて数字を表示しようとするとエラーが発生してしまいます。

具体的には以下の関数内でのことなのですが、原因の分かる方がいましたら解答お願いします。

受け取った文字列を逆順にする関数です。



----------------------------------------------------------

void rev_str(char *a)
{
int length = 0;


cout << length; // ここでエラーが発生


while(true) {
if(*(a + length) == '\0') break;
length++;
}
for...続きを読む

Aベストアンサー

> void rev_str(const char *source, char *des)
> {
>  char *a = (char*)malloc(sizeof(source));
>  strcpy(a, source);
>  rev_str(a);
>  strcpy(des, a);
>  free(a);
> }
の中でmallocで確保されるサイズは sizeof(source)なので
char型のポインタサイズ ... 32Bit環境なら4バイトってことになります
その領域に対して strcpyを実行するので4バイト以上の文字列をコピーすればメモリー領域が破壊されます

NULL終端の文字列が対象なら
char *a = (char*)malloc( strlen( source ) );
といった具合に変更してみましょう

QC++での とusingnamespaceの関係等を教えてください。

どうでもいい質問なのですが…

C++で色々とソースを打っていると気づいたのです。
#include <iostream.h>とするとusing namespace std;の一文を書かなくてもコンパイルエラーになりません。
また、逆に#include <iostream>とするとusing namespace std;の一文が必要になります。

だから、h(ヘッダファイル)の.hは必要なのかな?と思い、#include <cstdlib.h>とするとコンパイルエラーになります。

なにか理屈がわかりません。コンパイラはVC++6.0です。よろしくご回答の方お願いいたします。

Aベストアンサー

完全な法則、理屈があるというよりも、歴史的経緯によるものです。

<iostream.h>は、namespace stdがまだ決まってなかった頃の名残、「古いヘッダ」です。
VC6は言語仕様が正式に固まるより古い代物なので、
<iostream.h>という過渡期の遺物がついてます。
この頃は、namespace stdがまだなかったので、
<iostream.h>内の関数はusingしなくても使えます。

但し、今の言語仕様ではnamespace stdが導入されてますので、
あくまで互換性のためのものと思います。
新規に書くなら<iostream>を使うべきです。

一方、<iostream>の方は現行言語仕様通りのヘッダです。
こちらは、namespace std内の定義に正しくなっているため、
namespaceを指定して使う必要があります。

 using namespace std;や、using std::cout;の他、
 std::cout << "foo";などもできますので、
 必ずしもusing directiveやusing declarationが必要とは限りませんが。
 少なくとも、ヘッダなどで *むやみに* usingはnamespaceの意義を損ない好ましくないと思います(使い方次第)。

> h(ヘッダファイル)の.hは必要なのかな?と思い、

ちなみに、C++としては、単にヘッダであり、ファイルとは限りません。

> #include <cstdlib.h>とするとコンパイルエラーになります。

「c…」なヘッダには原則、対応するC言語のヘッダがあります。
「c…」というヘッダは、そのC言語のヘッダのC++版であり、
もし<cstdlib.h>に相当するものがあるとすれば、それは単に<stdlib.h>です。
C言語にはnamespaceがありませんので、<stdlib.hにもnamespace stdはありません。

<iostream>はC言語にはない、C++独自のヘッダであり、
<cstdlib>はC言語の<stdlib.h>のC++版なので、そのような挙動の違いになります。
<cstdio>と<stdio.h>とか、<cstring>と<string.h>とか、
もともと対応するC言語のヘッダがあるものは「c…」という名前になってます。

完全な法則、理屈があるというよりも、歴史的経緯によるものです。

<iostream.h>は、namespace stdがまだ決まってなかった頃の名残、「古いヘッダ」です。
VC6は言語仕様が正式に固まるより古い代物なので、
<iostream.h>という過渡期の遺物がついてます。
この頃は、namespace stdがまだなかったので、
<iostream.h>内の関数はusingしなくても使えます。

但し、今の言語仕様ではnamespace stdが導入されてますので、
あくまで互換性のためのものと思います。
新規に書くなら<iostream>を使うべきです...続きを読む

QC言語のプログラムで#includeを使わず#includeだけで

C言語のプログラムで#include<math.h>を使わず#include<stdio.h>だけで√(sqrt)を表現することは可能でしょうか?

Aベストアンサー

ご自分で sqrt 関数を作れば可能です。
こんな感じでしょうか。

#include <stdio.h>

static double
sqrt (double s)
{
 double x = s / 2.0;
 double last_x = 0.0;

 while (x != last_x)
 {
  last_x = x;
  x = (x + s / x) / 2.0;
 }

 return (x);
}

int
main (int argc, char * argv[])
{
 printf ("sqrt (%f) = %f\n", 3.0, sqrt (3.0));
}

QVC++2010の「#include <」

VC++ で、他人の作ったソースコードをビルドして実行してみています。
(WinPcapのデベロッパ向けのライブラリを使った、サンプルプログラムです。)

VC++自体、あまり理解が深くないのですが、
「#include <」まで書くと、「ヘッダファイル名が表示される」プロジェクトと、「そうではない」プロジェクトがあります。
「そうではない」方のプロジェクトだと、ビルド時にincludeするライブラリが足りないとか、そんな感じのエラーが表示されます。

ぱっと見の違いは、「ヘッダファイル名が表示される」プロジェクトの場合は、
ソリューションエクスプローラに、「外部依存関係」というフォルダのショートカットがあり、ライブラリがどっさりあります。

「そうではない」プロジェクトについても、「#include <」で、ヘッダファイルを表示してくれるようにしたいのですが、どの様にすればよいのでしょうか?★

プロジェクトのプロパティの、
C++>プリプロセッサ>プリプロセッサの定義
リンカー>入力>追加の依存ファイル
はどちらのソースも同じにしたのですが…。

VC++ で、他人の作ったソースコードをビルドして実行してみています。
(WinPcapのデベロッパ向けのライブラリを使った、サンプルプログラムです。)

VC++自体、あまり理解が深くないのですが、
「#include <」まで書くと、「ヘッダファイル名が表示される」プロジェクトと、「そうではない」プロジェクトがあります。
「そうではない」方のプロジェクトだと、ビルド時にincludeするライブラリが足りないとか、そんな感じのエラーが表示されます。

ぱっと見の違いは、「ヘッダファイル名が表示される」プロジェク...続きを読む

Aベストアンサー

カギ括弧形式の#include<xxx>は、VC++の場合プロジェクト プロパティの

1.「C/C++>全般>追加するインクルード ディレクトリ」で設定されているディレクトリ
2.「構成プロパティ>VC++ディレクトリ>インクルード ディレクトリ」で設定されているディレクトリ

の順に走査されます。
どちらかに、必要なインクルードファイルが含まれているディレクトリを設定してやれば、
インテリセンスの候補にも反映され、コンパイルも通ると思われます。


ちなみに、
「C++>プリプロセッサ>プリプロセッサの定義」は、
例えば、ソースコードの何処にも#define _DEBUGと書いて無くても、_DEBUGが定義されているようになる機能です。

「リンカー>入力>追加の依存ファイル」は、
静的リンクライブラリ(.lib)を走査するディレクトリの設定です。

どちらも#includeとは無関係です。


このカテゴリの人気Q&Aランキング

おすすめ情報