36060


今書いているプログラムは、関数部分と表示部分に分けていています。  
関数のファイルを`fanc.h`とし表示を`main.cpp`とします。

`fanc.h`では文字列型を扱っているので`"#include <string>`と記述してあります。  
`main.cpp`には、`#include "Fileinfo.h"`ヘッダーの呼び出しと、こちらでも文字列を扱うので`#include
<string>`と記述しているんですが、これは二重定義になってますよね？

二重定義を防ぐために、`main.cpp`では"Fileinfo.h"がきちんと呼び出せていたら`#include
<string>`を実行させないためにはどのように書けばいいですか？

* * *

  * fanc.h
[code]     #include <string>

    
[/code]

  * main.cpp
[code]     #include <string>

    #include "Fileinfo.h"
    
[/code]


CC BY-SA 3.0
2017-07-03T05:58:19.540
36058
2017-07-25T10:06:21.273
2017-07-03T11:26:59.517
19110
20192
question
c++ preprocessor
includeについて


結論だけ言うとstring側で二重定義に対するケアが行われておりますので、使用側では対処不要となります。  
string側の実体ファイルで例として以下のような定義になっているはずです。

[code]

    #ifndef _LIBCPP___STRING
    #define _LIBCPP___STRING
    ...(snip)...
    #endif  // _LIBCPP___STRING
    
[/code]

仮に上記のようなケアが行われていないヘッダファイルをincludeする場合は  
以下の様にincludeすればよいです。

[code]

    #ifndef HOGEHOGE
    #define HOGEHOGE
    #include <string>
    #endif /* HOGEHOGE */
    
[/code]


CC BY-SA 3.0
2017-07-03T06:09:38.780
36060
2017-07-03T12:05:32.273
2017-07-03T12:05:32.273
19716
19716
36058
answer


ヘッダーファイル自身が、自身の多重インクルードを阻止しているのが普通です。  
例えば Windows のSDK のmath.hでは

[code]

     #ifndef _INC_MATH // もし_INC_MATHがまだ未定義なら、という意味ですね。(1)
     #define _INC_MATH // _INC_MATHを定義します(2)
      :
      ・・・math.h の中身・・・
      :
     #endif // INC_MATHが未定義の場合、のおしまい(3)
    
[/code]

の様にコードされています。

このヘッダーが二回目にインクルードされた時は、  
前のインクルード時に(2)で _INC_MATH が定義済みとなっているので、  
(1)のディレクティブの結果が「偽」となるため、(1)～(3)の部分はスキップされるわけですね。

MSのVisual Studio では、これとほぼ同等の効果を持つ記述として、「#pragma once」というものがあります。


CC BY-SA 3.0
2017-07-03T06:30:13.347
36062
2017-07-03T06:30:13.347
3793
36058
answer


string など提供されているものは2重インクルードに対処しているので、心配ありません。mainには #include
を書かないという手もありますが、かえって混乱を招くかもしれません。  
Fileinfo.h が2重に呼ばれたときに対処されているかの方が心配です。  
もし対処していない場合は、string内部での二重定義防止策（インクルードガード）をFileinfo.h にも施すべきです。

ただし、アンダースコアで始まり大文字が続く識別子や、先頭以外でも連続するアンダースコアが含まれている識別子はシステムが使う予約語ですので使わない事をお勧めします。アンダースコアで始まるグローバル変数名も予約されています。


CC BY-SA 3.0
2017-07-25T10:06:21.273
36657
2017-07-25T10:06:21.273
24517
36058
answer