2016-05-17 12 views
3

私はコードブロック(コンソールアプリケーション)で基本的でシンプルなプロジェクトを作成しようとしています。これは私が持っているものであるCodeblocks Cプロジェクト - ヘッダーファイルは冗長ですか? (なぜプロジェクトが動作するために必要なのですか?)

  • main.cの
  • func.c
  • がheader.hそれを動作させるためにしようと

、私は非常に簡単なプログラムを作成し、 3つのファイルすべてを、私がオンラインで見つけたいくつかのガイドラインに基づいて埋めることができると思った方法で満たしています。

のmain.c:

#include <stdio.h> 
#include <stdlib.h> 
#include "header.h" 

int main() 
{ 
    printf("Hello world!\n"); 
    jogar(); 
    return 0; 
} 

func.c:

#include "header.h" 
void jogar(){ 
    printf("Hello Mate!"); 
} 

がheader.h

#ifndef HEADER_H_INCLUDED 
#define HEADER_H_INCLUDED 
void jogar(); 

#endif // HEADER_H_INCLUDED 

このすべてがうまく動作します。私が奇妙なことを見つけたのはです。header.hファイルを削除しても、すべて同じ方法で動作します(出力は同じです)。 header.hファイルを実行するために必要なファイルはありませんか?私は間違って何をしていますか?

EDIT:私のコードブロックのバージョンは、最新のものです(13.12)。

UPDATE#2 - Aganjuによって入力に関しては、私はこれにファイルを変更しました:

のmain.c:

#include <stdio.h> 
#include <stdlib.h> 
#include "header.h" 

int main() 
{ 
    float x = 2.70; 
    float a = jogar(x); 
    printf("%f", a); 
    return 0; 
} 

functions.c:

#include "header.h" 
float jogar(float x){ 

    return x+1.10; 
} 

ヘッダー。 h:

#ifndef HEADER_H_INCLUDED 
#define HEADER_H_INCLUDED 
float jogar(float x); 

#endif // HEADER_H_INCLUDED 

今、hea der.hをインクルードすると、出力は3.80000(必要なはずです)になり、header.hの関数のプロトタイプを削除すると出力は乱数になります。それは理論的に何が起こると予想されたのでしょうか?

+0

古いバージョンのCでは、_implicit関数declarartion_という概念があります。コンパイラがタイプを知らない関数を見ると、関数は 'int'を返す_assume_いくつかの型のいくつかの引数を取ります。あなたのケースでは、これは十分に近いので、動作します( 'jogar'が実際に別の翻訳単位に存在しない場合、リンクエラーが発生することに注意してください)。コンパイルフラグを '-std = c99'または' -std = c11'に変更しても、それはもう動作しません。 – szczurcio

+0

ちょうど両方を試しても違いはありません。コンパイラはまだプロジェクトと出力をコンパイルしますが、それはまだ同じです... – Tonif4

+0

どのようにフラグを設定していますか?実際に変更していない可能性があります。 – szczurcio

答えて

1

関数jogarが入力パラメータを持っているか、int以上の何かを返すとすぐには動作しません。あるいは、少なくともコンパイラのマッチング能力が失われます。 Yとそれはあなたに言わないだろう)。

ヘッダーに宣言がないと、コンパイラーは関数が何かを取得し、intを返しているとみなします(初期の段階では、コンパイラーを想定していると思われます彼らはそれを行います)

+0

_gets何も返さず、何も返しません - これは本当に正しいわけではありません。これは 'int'を返し、任意の数の引数を取ると仮定しています。 – szczurcio

+0

フロートを返そうとしました。元の質問をソースコードと出力で更新しました。あなたの理論を確認しますか? – Tonif4

+0

はい。返された浮動小数点数は、メインプログラムによって整数として解釈されます。これは面白い整数値として表示されます。 – Aganju

-1

ヘッダーファイルを削除した後でプロジェクトをコンパイルしますか? :-)

+0

はい、あります。コンパイラはエラーを検出せず、出力はまったく同じです... – Tonif4

+0

これはコメントです。 – szczurcio

関連する問題