

例えば下の文で、

[code]

    #include<iostream>
    #include<cmath>
    
    float Myabs(float x);
    
    int main(){
        float a=2.5;
        std::cout<<Myabs(a)<<std::abs(a);
        a=-5.25;
        std::cout<<Myabs(a)<<std::abs(a);
        return 0;
    }
    
    float Myabs(float x){return x>0?x:-x;}
    
[/code]

この文を下の2つの例のように変更すると  
例１

[code]

    #include<iostream>
    
    float Myabs(float x);
    
    int main(){
        float a=2.5;
        std::cout<<Myabs(a)<<std::abs(a);
        a=-5.25;
        std::cout<<Myabs(a)<<std::abs(a);
        return 0;
    }
    #include<cmath>
    float Myabs(float x){return x>0?x:-x;}
    
[/code]

例２

[code]

    #include<iostream>
    #include<cmath>
    
    int main(){
        float a=2.5;
        std::cout<<Myabs(a)<<std::abs(a);
        a=-5.25;
        std::cout<<Myabs(a)<<std::abs(a);
        return 0;
    }
    float Myabs(float x);
    float Myabs(float x){return x>0?x:-x;}
    
[/code]

どちらもエラーが出ます。宣言が無いために出るエラーとインクルードが無いために出るエラーです。  
これは、コンパイラから見てinclude文と宣言が同じ動作をすることを示していますか？


CC BY-SA 3.0
2015-08-04T03:11:02.143
13009
2015-08-05T06:44:02.253
2015-08-05T06:44:02.253
4236
10787
question
c++ preprocessor
includeと宣言の違いはなんですか


まず、 **includeと宣言は異なります。**  
`#include`はコンパイル時にファイルの中身を取り込む機能しか持ちません。  
通常は`#include`ではヘッダファイルを取り込むのに使われます。ヘッダファイルは、通常は宣言が書かれたファイルです。`iostream`や`cmath`もヘッダファイルであり、`std::cout`や`std::abs`などの宣言が記述されています。このことから、混同していると思われます。

### 例１

`std::abs` の宣言は `<cmath>` に記述されています。ですが、`#include
<cmath>`が登場する前に`std::abs(a)`が登場しているため、宣言が見つからずエラーになります。

### 例2

`Myabs(a)` が、`float Myabs(float x);`の宣言よりも前に登場しているためエラーになります。


CC BY-SA 3.0
2015-08-04T03:27:11.217
13011
2015-08-04T03:33:16.190
2015-08-04T03:33:16.190
2750
2750
13009
answer


コンパイルオプション `-E`
を試してみてください。プリプロセッサーによって処理されたソースコードが出力されます。これによって出力されるソースコードこそがC言語やC++言語のソースコードです。そこには
`#include` や `#define` `#if` `#endif` などのプリプロセッサ命令は処理されて消えていることが理解できると思います。


CC BY-SA 3.0
2015-08-04T06:14:52.647
13018
2015-08-04T06:14:52.647
4236
13009
answer