2016-09-09 14 views
1

私のcコンパイラが次の(単純化された)コードで警告/エラーを出さない理由を理解しようとします。C - gcc:関数宣言/実装が異なるコンパイラ警告がありません。

some.h:

void foo();

some.c:

static uint32_t count = 0; 

void foo(uint32_t num) { 
    count += num; 
    print("Count: %u"); 
} 
機能の実装はパラメータを有し、一方

関数宣言はパラメータを有していません

mai n.c:

foo(100); 
foo(); 

出力:ターゲット・ビルドの

Count: 100 
Count: 100 

コンパイラ:ターゲット・ビルドの

gcc-arm-none-eabi-4_9-2015q1-20150306-win32 

リンカ:

gcc-arm-none-eabi-4_9-2015q1-20150306-win32 

コンパイラフラグ:Cで

-Wall -Werror -DuECC_CURVE=uECC_secp256r1 -DMEMORY_CHECK -DDEBUG -Os -g3 -DBACKTRACE

+0

あなたの編集ステートメント?含まれますか? –

+0

'print'は' printf'です。[UB](Ub)[UB](https://en.wikipedia.org/wiki/Undefined_behavior) – LPs

+0

デバッグのヘルプを求める質問(「なぜこれではないのですか?コードは動作していますか? ")には、目的の動作、特定の問題またはエラー、および質問自体にそれを再現するのに必要な最短コードが含まれていなければなりません。明確な問題文がない質問は、他の読者にとって有用ではありません。参照:最小、完全、および検証可能な例を作成する方法。 – Olaf

答えて

0

この関数宣言

void foo(); 

は、宣言のポイントにおける関数のパラメータについて知られて何もないことを意味します。

パラメータの種類と数は、関数呼び出しから導き出されます。パラメータの数および引数の数が不一致ので、あなたのプログラムについては

は、このコール

foo(); 

は未定義の動作をしています。そのため、下位互換性の

4

、引数を取らない関数を宣言しません

void foo(); 

のような宣言は、それは未知のタイプの引数の数が不明な取る関数を宣言します。

これは、両方の呼び出しが正しいことを意味し、コンパイラは実際にあなたに警告することはできません。

もう1つの問題は、ソースファイル内の宣言がヘッダーファイル内の宣言と実際に一致していることです。したがって、警告もエラーも表示されません。

+5

ここに引数を取らない関数の宣言があります: 'void foo(void);' –

関連する問題