includeと宣言の違いはなんですか


例えば下の文で、

[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文と宣言が同じ動作をすることを示していますか？




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

