- 1 名前:デフォルトの名無しさん mailto:sage [2007/12/08(土) 14:09:22 ]
- エスケープシーケンスやWin32APIなどの環境依存なものでもOK。
ただしその場合、質問者は必ず環境を書きましょう。 ※sage禁止です(と代々スレに書いてありますが自己判断で)。 【前スレ】 【初心者歓迎】C/C++室 Ver.44【環境依存OK】 pc11.2ch.net/test/read.cgi/tech/1194016813/ 【アップローダー】(質問が長い時はココ使うと便利) kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/joyful.htm
- 982 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:31:36 ]
- 取得したデータをfile.txtというテキストファイルを自動生成してそこに出力したくて
//取得データのfile.txtファイルの自動生成 FILE *fp; fp = fopen("file.txt","w"); と書きました。 コンパイルしたら error C2065: 'fp' : 定義されていない識別子です。 と表示されました。fpというのはどのような宣言をすればいいのでしょうか。 環境はWindows XP Pro SP2、メモリ2G、VC++2005(Express)です。 アドバイスお願いします。
- 983 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:39:16 ]
- >>982
そのコードを見る限りでは、それで問題なさそうだよ。 ・#include <stdio.h> があるか ・C++ではなくCなら変数宣言はブロックの先頭じゃなきゃいけない ・直前のコメントを消してみる などをチェキ
- 984 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 14:57:35 ]
- >>983
#include<stdio.h>がありませんでした。 追加してみたけど変わりませんでした。 Cとかかれていたサンプルプログラムをいじっているのですが拡張子が*.cppなのでC++なのでしょうか。 int main(){ 直後に FILE *fp; を置いたらエラーが消えました! ありがとうございました! もうひとつ質問で申し訳ないのですが *.cはC言語でしょうけど*.cppというのはCでもC++でもあるのでしょうか。 判別方法というのはあるのでしょうか。
- 985 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:11:53 ]
- >>984
大概のコンパイラは*.cをC、.cppをC++と見なしてコンパイルする。 C99以外のCなら大抵の場合C++としても通るから、普通は.cppで問題ない。 (ただしDLLのソースとかでエクスポート関数がある場合は注意)
- 986 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:12:00 ]
- >>984
一般的なコンパイラならファイル名が*.cppならC++とみなして コンパイルすると思うけど、 それをCとしてコンパイルする手段はあるだろうし、 あなたがどうやってコンパイルしているかわからないので、 何とも言えず。 気になるようだったら、main()の最初に #ifdef __cplusplus printf("C++なの\n"); #else printf("Cなの\n"); #endif とでも入れてどっちが表示されるか試してみるといいかもね。
- 987 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 15:14:04 ]
- >>985-986
なるほど〜。 ありがとうございます。 コンパイルの方法は VC++のソリューションエクスプローラーのソースファイルを右クリックする といった方法でやっています。
- 988 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:07:49 ]
- へぇ、VC++では右クリックでコンパイルされるのか。珍しいI/Fだな。
- 989 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 16:18:43 ]
- コンテキストメニューからソースファイル単位のコンパイルってことだろ
- 990 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 17:31:22 ]
- template<bool>
struct CompileTimeChecker { CompileTimeChecker(...); }; template<> struct CompileTimeChecker<false> {}; #define STATIC_CHECK(expr, msg)\ {\ class ERROR_##msg {}; \ (void)sizeof(CompileTimeChecker<(expr) != 0>(ERROR_##msg()));\ } int main() { STATIC_CHECK(true, HOGEHOGE) } Modern C++のCompileTimeCheckerというコンパイル時にエラーチェック をするマクロなのですが、コンパイルが通るはずの条件で呼び出して も、VC++ 2008では以下のエラーが出てコンパイルできません。 関数型へのキャストが正しくありません。 'CompileTimeChecker<__formal> (main::ERROR_HOGEHOGE (__cdecl *)(void))': sizeof オペランドが正しくありません。 g++ v4でも 関数へのsizeof?が不正だといわれます。何か間違ってるところはありますか? 本のソースそのままなのですが。
- 991 名前:990 mailto:sage [2007/12/27(木) 17:39:24 ]
- ちなみにBCCでは通りました。
- 992 名前:990 mailto:sage [2007/12/27(木) 18:00:30 ]
- どうやらsizeofに一時オブジェクトを渡すのは不正みたいですね。
以下でうまくいくようです。著者はどうやってコンパイルできたか 疑問です。コンパイラの違いでしょうか?ソースも間違っている みたいです。 template<bool> struct CompileTimeChecker { CompileTimeChecker(...){} //定義が必要だった }; #define STATIC_CHECK(expr, msg) \ {\ class ERROR_##msg {};\ CompileTimeChecker<(expr) != 0> c = CompileTimeChecker<(expr) != 0>((ERROR_##msg())); \ (void)sizeof(c); \ }
- 993 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 18:10:10 ]
- >>992
BCCしか使ってないんじゃね?
- 994 名前:990 mailto:sage [2007/12/27(木) 18:16:35 ]
- >>993
いくつかのコンパイラで試したと書いてありましたが それらでは問題なかったんでしょうね。 もはや (void)sizeof(c); \ の行は不要ですね。 どうやらエラーが出ていたのは一時オブジェクトではなく sizeof(Widget())という形が関数に対してsizeofが行われて いると判断されてたみたいです。これはもちろん不正ですが。
- 995 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:27:19 ]
- 995
- 996 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:33:48 ]
- pc11.2ch.net/test/read.cgi/tech/1198755167/
はい新スレ >>1の名前は気にしないでくれ。間違えた。
- 997 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:36:50 ]
- 擦れた手乙埋め
- 998 名前:998 mailto:sage [2007/12/27(木) 20:41:39 ]
- 99−
- 999 名前:999 mailto:sage [2007/12/27(木) 20:42:00 ]
- 999666999666
1000!
- 1000 名前:デフォルトの名無しさん mailto:sage [2007/12/27(木) 20:42:22 ]
- 1000は俺が取るよ。
- 1001 名前:1001 [Over 1000 Thread]
- このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
|

|