関数ポインタのキャストについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
CUser

関数ポインタのキャストについて

#1

投稿記事 by CUser » 5年前

関数ポインタのキャストってやっていいのでしょうか?
調べると方法があったのでやっていいのでしょうがちょっと疑問もあります。
大別して2個あります。
(1) 本当にやっていいのか
(2) 引数の省略について

下の例で説明します。

コード:

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

static void
forced_exit(void)
{
    fprintf(stderr, "終了します\n");
    exit(1);
}

static int
func_1(int ac, char *av)
{
    printf("c1 = %d, c2 = %s\n", ac, av);
    return 0;
}

//  引数が多いほうに合わせるキャスト
static int  (*funcp_1)(int ac, char *av) = (int (*)(int, char *))forced_exit;

//  引数が少ないほうに合わせるキャスト
static void (*funcp_2)(void) = (void (*)(void))func_1;

int
main(int argc, char **argv)
{
    int i1 = 0;
    char *s1 = "";

    if(argc > 1)
    {
        i1 = 12;
        s1 = argv[1];
        funcp_1 = func_1;
    }

    (*funcp_1)(i1, s1);
    funcp_2();

    return 0;
}
(1) 本当にやっていいのか
 (1)-1
コンパイル時の警告をなくすためにキャストしてみました。
実際に funcp_1 のような使い方をしようと思っています。
forced_exit()関数もそのままで、funcp_1 を初期化します。
以降特に何もなければ funcp_1 を呼んだときに強制終了させます。
こういうキャストはありでしょうか?

 (1)-2
上の funcp_1 例では引数が多いほうに合わせるキャストなので問題ないような気がしますが、
funcp_2 の例では引数が少ないほうに合わせるキャストなので問題ありのような気がします。
これについてはどうなんでしょう?(こっちは実際にやろうとは思っていません)

(2) 引数の省略について
キャストのところの引数を後で書こうと思って(下の例のように)中身を書かず
それを忘れてコンパイルしました。すると何の警告も出ませんでした。
(引数のところがなくても警告が出なかったので
 試しに funcp_1 のところに void を入れてみました。すると警告が出ました。
 void に関してはそうなるだろうとは思いました。)
引数のところは不要なのでしょうか?

コード:

//  引数が多いほうに合わせるキャスト
static int  (*funcp_1)(int ac, char *av) = (int (*)())forced_exit;

//  引数が少ないほうに合わせるキャスト
static void (*funcp_2)(void) = (void (*)())func_1;
以上、よろしくお願いします。

“C言語何でも質問掲示板” へ戻る