11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【c言語】implicit declaration of functionを回避するプロトタイプ宣言

Last updated at Posted at 2020-02-16

エラーとなるコード

#include <stdio.h>
int main(void){
    int value;
    average(50, 100, &value); 
    printf("%d\n", value);
    return 0;
}

void average (int min, int max, int *answer) {
    *answer = (min + max)/2;
    return;
    
}

プログラムは上から処理される。
main関数ではaverage関数を呼び出している。しかし、average関数はmain関数より後に書かれているため下記のようなエラーが生じる。
つまり、使用する関数は呼び出す前に定義されていないといけない。

Main.c:8:5: warning: implicit declaration of function 'sum' is invalid in C99 [-Wimplicit-function-declaration]
    sum(50, 100, &value); 
    ^
Main.c:13:6: error: conflicting types for 'sum'
void sum (int min, int max, int *answer) {
     ^
Main.c:8:5: note: previous implicit declaration is here
    sum(50, 100, &value); 
    ^
1 warning and 1 error generated.

上記エラーを回避するための方法は2つ。

1つ目は記載順を変えること。average関数をmain関数より前に記述すればOK。
2つ目はプロトタイプ宣言をすること。
プロトタイプを宣言すると、関数について並びを考慮する必要がなくなり良い。
プロトタイプ宣言は、関数の中身の処理は省いて名前だけ先に定義できる機能。

下記のようにコードの先頭で宣言しておけばよい。

#include <stdio.h>

void average (int, int, int*); //プロトタイプ宣言!

int main(void){
    int value;
    average(50, 100, &value); 
    printf("%d\n", value);
    return 0;
}

void average (int min, int max, int *answer) {
    *answer = (min + max)/2;
    return;
    
}

つぶやき。
main関数ってコードの一番下に書かれてることが多いなーなんでだろうなーと思っていたけど、
関数が宣言されてから使う必要がある(もしくはその名残?)からだったのか!と思った。

11
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?