- ベストアンサー
namespace定義の使い方
こんにちは。 C++を勉強しています。 今回は、namespace宣言して使いたいのですが、ヘッダー内でnamespace宣言をすると重複してしまいます。namespaceで定義したものを他のファイルでも使いたい場合はどうすればいいでしょうか? よろしくお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (5)
- sygh
- ベストアンサー率76% (42/55)
- Tacosan
- ベストアンサー率23% (3656/15482)
- redfox63
- ベストアンサー率71% (1325/1856)
- Tacosan
- ベストアンサー率23% (3656/15482)
- 麻野 なぎ(@AsanoNagi)
- ベストアンサー率45% (763/1670)
関連するQ&A
- 定義されているのにエラーになる
閲覧ありがとうございます。 C言語のプログラムの話です。 ソースファイルaaa.cでstdio.hをincludeしています。 stdio.hには extern FILE _iob[_NIOBRW]; というのが定義されているにも関わらず、 コンパイルすると、 aaa.o:aaa.c:(.data+0x58): undefined reference to '_iob' というエラーが出ます。 aaa.cでは_iobに関する宣言はしていませんが、それを使うこともしていません。 ヘッダファイルでexternで宣言してるからかなと思い、ソースファイルにexternなしの宣言を書き足したら、コンパイルは通りました。 今回は元々既にあるプロジェクトの改修だったのですが、宣言を消したりしていません。 しかし、その部分は元々ヘッダファイルに宣言などしなくてもコンパイルが通ってました。 昔はヘッダファイルでexternで宣言してたらソースファイルではしなくてオッケーみたいな感じだったんですかね? 私自身、あまりよく分かってなくて文章もめちゃくちゃですみません。 不足している情報があればできる範囲でお伝えしますので、ご協力よろしくお願いいたします。
- 締切済み
- C・C++・C#
- using namespace std;//?
nubou C++で using namespace std; という宣言が使えるということなのですが ・namespaceとはなんでしょうか? ・stdとはなんでしょうか? ・このような宣言が必要な場面はどのようなときなのでしょうか? いずれかひとつでも結構です (質問に間違いがありましたので修正しました) よろしくお願いします
- ベストアンサー
- C・C++・C#
- C++のnamespace stdについて
C++のnamespace stdについて教えて下さい。 coutを使用する場合"iostream"をインクルードし、using namespaceでstd名前空間を使用します。 printfを使用する場合"cstdio"をインクルードし、using namespaceでstd名前空間を使用します。 どちらのインクルードファイルにもnamespace stdという風に同じ名前の名前空間を 使用しているのでしょうか? もしもそうだとしたらcstdio,iostreamの両方をインクルードしている場合 名前空間が競合してしまうのではないでしょうか? namespaceはjavaでいうパッケージにあたる物だと思っていたので、 これでは意味がないのではないかと思いました。 それとも意図的に同じ名前空間を定義している意味があるのでしょうか? C++を使い始めたばかりで戸惑っています。どなたかお答え頂ければありがたいです。
- ベストアンサー
- C・C++・C#
- クラスのメンバ関数を別ファイルで定義したときのバグ
C++ においてヘッダファイルで宣言したクラスのメンバ関数を別のソースファイルで定義して、コンパイルするとうまくいきません。エラーは出ないのですが、同名の何もしない関数としてコンパイルされているようなのです。クラスのメンバ関数を宣言したのと同じヘッダに書くとちゃんとコンパイルされます。 どうしてそうなるのか、いまいち原因がわかりません。
- 締切済み
- C・C++・C#
- ヘッダーの多重定義での疑問です。
Cで開発をしているのですが、ヘッダーファイルでの定義ではたとえば、int a と か double hoge とか定義して、そのヘッダーファイルを複数の cファイルが読み込むと多重定義になりますよね? hoge.h int a; // 多重定義 このヘッダーを複数の.cファイルに読み込む しかし、自分のプロジェクトだと、ヘッダーファイルにint aとかdouble hogeとか 定義してもエラーにならないんです。 ただし、int b = 10;のように代入すると多重エラー また、試しに新しくプロジェクトを作ってヘッダーで定義すると多重定義でエラーでした。
- 締切済み
- C・C++・C#
- privateなnamespaceメンバ
namespace内のメンバをprivateのようにしたいときは、無名名前空間を使うとあったのですが、ヘッダオンリーライブラリでこれを実現する方法はありませんか? 紹介されている方法 //hoge.h namespace Hoge{ void hoge(); } //hoge.cpp namespace Hoge{ namespace{ void hogeHelper(){} } void hoge(){hogeHelper();} } 上記の方法ではhoge.cpp以外からはhogeHelperにはアクセスできなくなるとのことです。 しかし、ヘッダオンリーライブラリで次のように書いている場合にHoge::hogeHelperとしてアクセスできてしまいます。 //hoge.h namespace Hoge{ namespace{ inline void hogeHelper(){} } inline void hoge(){hogeHelper();} } (ライブラリを書き換えない限り)hogeHelperへのアクセスを禁止する方法はありませんか?
- ベストアンサー
- C・C++・C#
- ヘッダファイルにおける文字列リソース定義
C言語(主にVC++)で開発をしていると、よく、 const char MSG_HELLO[] = "HELLO!"; のように、ヘッダファイル中で、文字列リテラルを定義します。 自分もいつのまにかこのようにリソース定義するようになっていましたが、初期の頃から疑問だったのは、extern宣言せずにchar配列を宣言しているから、コンパイラが最適化しなかったら、上記宣言のあるヘッダファイルを読み込んで、その定義を使った個所のあるソース分文字列リテラルがメモリ上に確保されてしまうのではないか、、?ということです。 つまり、本来なら const char* MSG_HELLO[] = "HELLO!"; とソースファイル中で定義し、ヘッダファイルには extern const char* MSG_HELLO; とすべきではないか、と思うわけです。ただ実際にこれをやっているとヘッダとソースの両方のメンテナンスが必要になるので、冒頭のように記述しているのだと思いますが。 この、本来なら下記のようにすべきだが、コンパイラの最適化(リソースのプール)を期待して最初のように書いている、という解釈は正しいでしょうか?
- 締切済み
- C・C++・C#
- 関数の実体定義にヘッダファイルの2重定義防止方法が効かない?
いつもお世話になっています。 MFCでCプログラミングをしています。 ヘッダファイルの2重定義防止のために、 ヘッダファイル全体を下記のように 囲みました。 <aaa.h> #ifndef AAA #define AAA #define PI 3.141592 void Func(); int wa(int a, int b){ return a+b; } #endif ビルドしたところ、 関数宣言(Func)や#define部分(PI)については、 2重定義が防止されているようなのですが、 関数の実体部分(関数wa)については、 2重定義防止機能が働かず、 ***.obj : error LNK2005: "int __cdecl wa(int a, int b)" は既に ***.obj で定義されています。 というリンクエラーが表示されます。 関数の種類や ヘッダファイル内の宣言の順番を いろいろ変えてみたのですが同じ結果でした。 ここで、このヘッダファイルの先頭に #pragma onceを使用すると このリンクエラーは回避されるのですが、 他コンパイラとの互換性の観点から、 #pragma once以外の方法で実現する必要があるので、 困っています。 URLを検索してみたのですが、 このような特殊な場合について記述されているものは 見つけられませんでした。 どなたか解決法又はヒントをご教示頂ければ ありがたいです。 よろしくお願いします。
- ベストアンサー
- C・C++・C#
- PHP5のnamespace
PHP5では名前空間をサポートしているという・・・。 http://www.atmarkit.co.jp/flinux/special/php5/php5c.html しかし、上記URLに記されている例を実行させようとしても namespaceを定義した所で文法エラーになります。 私、何か勘違いしていますか? もしくは何か設定でもあるのでしょうか? 利用しているPHPのバージョンは5.2.2です。
- ベストアンサー
- PHP
- c#のマクロ定義について
C言語でマクロ定義の場合以下のようにヘッダファイルに#defineで定義しますが、C#の場合どのようにすればいいのでしょうか。 C言語の場合 *** test.h *** #define TEST 5 C#の場合 public const int TEST = 5; //これでいいの? 専用のclassを用意するの? 初歩的な質問ですが宜しくお願い致します。
- ベストアンサー
- C・C++・C#
- スキャン機能が正常に動作せず、スキャン⇒PC⇒ファイル-フォルダ保存ができない問題が発生しています。
- 最近、PCが不調になったため、PCを初期状態に戻した際にスキャン機能が正常に動作しなくなりました。
- お使いの環境はWindows 10で、接続はUSBケーブルを使用しています。関連するソフト・アプリは特にありません。
お礼
なるほど、#defineを使ってソースファイルで定義することにより一度しか読み込まなくなるんですね。 それで重複定義を防げると。 大変参考になりました。