【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.21778

C++でのマクロ実装のC標準関数の使い方
投稿者---chu-(2005/07/05 16:10:26)


Win98, C++Builder5

Aは普通にいけましたが、Bはエラーが出てしまいました。
少し考えて、Cの用に#undefするとエラーは消えました。
using無しで#undefせずに使う方法はないのでしょうか。

// A:using有り
#include <cstdio>
using namespace std;
int main(void)
{
  putchar('A');
  return 0;
}

// B:using無し
#include <cstdio>
int main(void)
{
  std::putchar('A');  // エラー: 識別子が必要, 未定義のシンボル _streams, 未定義の関数 '_fputc'を呼び出した
  return 0;
}

// C:using無し(修正版)
#include <cstdio>
#undef putchar     // 追加
int main(void)
{
  std::putchar('A');
  return 0;
}



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C++でのマクロ実装のC標準関数の使い方 21779 NykR 2005/07/05 16:54:06


No.21779

Re:C++でのマクロ実装のC標準関数の使い方
投稿者---NykR(2005/07/05 16:54:06)


マクロだと解釈させなければいいので、
(std::putchar)('A')
とすればエラーは消えると思います。

# using namespace ...が都合が悪いのはわかりますが、
# using自体は使ってもよいのでは?
# using std::putchar; の様にも書けますし。


この投稿にコメントする

削除パスワード

No.21780

Re:C++でのマクロ実装のC標準関数の使い方
投稿者---chu-(2005/07/06 09:51:03)


返信ありがとうございます。

> (std::putchar)('A')
しっかりエラーは消えました。
なぜ消えたのか理解できていないのですが、
> マクロだと解釈させなければいいので
ということは、#undefせずに関数実装側のputcharを呼び出せているということでしょうか。

> # using std::putchar; の様にも書けますし。
残念ながらEのように関数名をカッコで囲まないとエラーになりました

using namespaceを使うと関数実装であろうとマクロ実装であろうと同じようにfunc()と呼び出せるのに、
使わないと、マクロ実装の関数は(func)()として呼び出さないといけない。
実装方法を意識せずに済むのが理想なのですが、
これはしょうがないことなのでしょうか。

#include <cstdio>
//using namespace std;   // A
//#undef putchar      // C
using std::putchar;      // E
int main(void)
{
// putchar('A');       // A - OK
// std::putchar('A');    // B - 識別子が必要, 未定義のシンボル _streams, 未定義の関数 '_fputc'を呼び出した
// std::putchar('A');    // C - OK
// (std::putchar)('A');   // D - OK
// (std::printf)("ABC");  // D確認 - OK
// putchar('A');       // E - 未定義のシンボル _streams, 未定義の関数 '_fputc'を呼び出した
  (putchar)('A');       // E - OK
  return 0;
}



この投稿にコメントする

削除パスワード

No.21783

Re:C++でのマクロ実装のC標準関数の使い方
投稿者---かずま(2005/07/06 23:05:13)


>> (std::putchar)('A')
> しっかりエラーは消えました。
> なぜ消えたのか理解できていないのですが、

putchar の次に ( が来ていないからです。
関数型マクロ(引数付きマクロ)は引数がないとマクロとして展開されません。

次のようにしてみてください。
#include <cstdio>

using std::_streams;
using std::_fputc;

int main(void)
{
    putchar('A');
    return 0;
}



この投稿にコメントする

削除パスワード

No.21788

Re:C++でのマクロ実装のC標準関数の使い方
投稿者---chu-(2005/07/07 09:42:56)


返信ありがとうございます。

> putchar の次に ( が来ていないからです。
なるほど。理解しました。

> 次のようにしてみてください。
こちらもなるほど。しっかりエラーが消えて実行できました。
でもputcharを使いたいのにusingしているのは_streamsと_putcというのは気味の悪いコードですね。

C++でC標準関数を使う場合はusing namespaceしたほうが実装方法を意識せずに済み無難、というところでしょうか。

すっきりしました。
ありがとうございました。



この投稿にコメントする

削除パスワード

No.21789

Re:C++でのマクロ実装のC標準関数の使い方
投稿者---かずま(2005/07/07 10:33:00)


using namespace std; を関数の外で使うと、std に閉じ込められていた
すべての名前がぶちまけられてしまうので、お勧めできません。

関数やブロックの内側で局所的に使用するとよいでしょう。

#include <cstdio>

int main()
{
    using namespace std;
    putchar('A');
}



この投稿にコメントする

削除パスワード

No.21792

Re:C++でのマクロ実装のC標準関数の使い方
投稿者---chu-(2005/07/07 11:44:28)


> 関数やブロックの内側で局所的に使用するとよいでしょう。
ありがとうございます。
この方法で使用することにします。



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧