【初心者歓迎】C/C++室 Ver.45【環境依存OK】at TECH
【初心者歓迎】C/C++室 Ver.45【環境依存OK】 - 暇つぶし2ch981:デフォルトの名無しさん
07/12/27 12:47:14
>>868
亀杉だがあらかじめ引数が変化することが分かってるなら動的引数なんて方法もあるな

982:デフォルトの名無しさん
07/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:デフォルトの名無しさん
07/12/27 14:39:16
>>982
そのコードを見る限りでは、それで問題なさそうだよ。

・#include <stdio.h> があるか
・C++ではなくCなら変数宣言はブロックの先頭じゃなきゃいけない
・直前のコメントを消してみる
などをチェキ


984:デフォルトの名無しさん
07/12/27 14:57:35
>>983
#include<stdio.h>がありませんでした。
追加してみたけど変わりませんでした。

Cとかかれていたサンプルプログラムをいじっているのですが拡張子が*.cppなのでC++なのでしょうか。
int main(){
直後に
FILE *fp;
を置いたらエラーが消えました!
ありがとうございました!

もうひとつ質問で申し訳ないのですが
*.cはC言語でしょうけど*.cppというのはCでもC++でもあるのでしょうか。
判別方法というのはあるのでしょうか。


985:デフォルトの名無しさん
07/12/27 15:11:53
>>984
大概のコンパイラは*.cをC、.cppをC++と見なしてコンパイルする。
C99以外のCなら大抵の場合C++としても通るから、普通は.cppで問題ない。
(ただしDLLのソースとかでエクスポート関数がある場合は注意)

986:デフォルトの名無しさん
07/12/27 15:12:00
>>984
一般的なコンパイラならファイル名が*.cppならC++とみなして
コンパイルすると思うけど、
それをCとしてコンパイルする手段はあるだろうし、
あなたがどうやってコンパイルしているかわからないので、
何とも言えず。

気になるようだったら、main()の最初に
#ifdef __cplusplus
printf("C++なの\n");
#else
printf("Cなの\n");
#endif
とでも入れてどっちが表示されるか試してみるといいかもね。


987:デフォルトの名無しさん
07/12/27 15:14:04
>>985-986
なるほど~。
ありがとうございます。

コンパイルの方法は
VC++のソリューションエクスプローラーのソースファイルを右クリックする
といった方法でやっています。


988:デフォルトの名無しさん
07/12/27 16:07:49
へぇ、VC++では右クリックでコンパイルされるのか。珍しいI/Fだな。

989:デフォルトの名無しさん
07/12/27 16:18:43
コンテキストメニューからソースファイル単位のコンパイルってことだろ

990:デフォルトの名無しさん
07/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
07/12/27 17:39:24
ちなみにBCCでは通りました。

992:990
07/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:デフォルトの名無しさん
07/12/27 18:10:10
>>992
BCCしか使ってないんじゃね?

994:990
07/12/27 18:16:35
>>993
いくつかのコンパイラで試したと書いてありましたが
それらでは問題なかったんでしょうね。
もはや (void)sizeof(c); \ の行は不要ですね。
どうやらエラーが出ていたのは一時オブジェクトではなく
sizeof(Widget())という形が関数に対してsizeofが行われて
いると判断されてたみたいです。これはもちろん不正ですが。

995:デフォルトの名無しさん
07/12/27 20:27:19
995

996:デフォルトの名無しさん
07/12/27 20:33:48
スレリンク(tech板)
はい新スレ
>>1の名前は気にしないでくれ。間違えた。

997:デフォルトの名無しさん
07/12/27 20:36:50
擦れた手乙埋め

998:998
07/12/27 20:41:39
99-

999:999
07/12/27 20:42:00
999666999666

1000!

1000:デフォルトの名無しさん
07/12/27 20:42:22
1000は俺が取るよ。

1001:1001
Over 1000 Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch