私はコードブロック(コンソールアプリケーション)で基本的でシンプルなプロジェクトを作成しようとしています。これは私が持っているものである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の関数のプロトタイプを削除すると出力は乱数になります。それは理論的に何が起こると予想されたのでしょうか?
古いバージョンのCでは、_implicit関数declarartion_という概念があります。コンパイラがタイプを知らない関数を見ると、関数は 'int'を返す_assume_いくつかの型のいくつかの引数を取ります。あなたのケースでは、これは十分に近いので、動作します( 'jogar'が実際に別の翻訳単位に存在しない場合、リンクエラーが発生することに注意してください)。コンパイルフラグを '-std = c99'または' -std = c11'に変更しても、それはもう動作しません。 – szczurcio
ちょうど両方を試しても違いはありません。コンパイラはまだプロジェクトと出力をコンパイルしますが、それはまだ同じです... – Tonif4
どのようにフラグを設定していますか?実際に変更していない可能性があります。 – szczurcio