次のように、コードを取得してそれからSSCCEを作成します。
#include <stdlib.h>
struct RTIME { int a; int b; };
typedef const struct RTIME RTIME;
RTIME *rtCreate(void)
{
RTIME *rtime;
rtime = malloc(sizeof(*rtime));
if (rtime != NULL)
{
/* Initialization stuff */
}
return rtime;
}
void rtDestroy(RTIME **rtime)
{
if (*rtime != NULL)
{
free(*rtime);
*rtime = NULL;
}
}
GCC 4.7.1 とコマンドラインでコンパイル:
$ gcc -O3 -g -std=c99 -Wall -Wextra -Wmissing-prototypes -c mf.c
mf.c:6:8: warning: no previous prototype for ‘rtCreate’ [-Wmissing-prototypes]
mf.c:20:6: warning: no previous prototype for ‘rtDestroy’ [-Wmissing-prototypes]
mf.c: In function ‘rtDestroy’:
mf.c:24:9: warning: passing argument 1 of ‘free’ discards ‘const’ qualifier from pointer target type [enabled by default]
In file included from mf.c:1:0:
/usr/include/stdlib.h:160:7: note: expected ‘void *’ but argument is of type ‘const struct RTIME *’
$
を省略するconst
と、欠落しているプロトタイプに関する (有効な) 警告のみが表示されます。
古いバージョンの GCC を使用していると思います (古いバージョンにはnote:
行に追加情報が含まれていないため)、何らかの形でtypedef
forRTIME
にconst
.
原則として、 は必要ありませんconst
がtypedef
、ルールには例外があります。
編集された質問から、修飾子がvolatile
ではなくconst
. typedef
サンプル コードのが変更されると、GCC 4.7.1 は次のように言います。
mf.c:6:8: warning: no previous prototype for ‘rtCreate’ [-Wmissing-prototypes]
mf.c:20:6: warning: no previous prototype for ‘rtDestroy’ [-Wmissing-prototypes]
mf.c: In function ‘rtDestroy’:
mf.c:24:9: warning: passing argument 1 of ‘free’ discards ‘volatile’ qualifier from pointer target type [enabled by default]
In file included from mf.c:1:0:
/usr/include/stdlib.h:160:7: note: expected ‘void *’ but argument is of type ‘volatile struct RTIME *’
システム GCC でコンパイルすると、より単純で精度の低いエラー メッセージが表示されます。
mf.c:7: warning: no previous prototype for ‘rtCreate’
mf.c:21: warning: no previous prototype for ‘rtDestroy’
mf.c: In function ‘rtDestroy’:
mf.c:24: warning: passing argument 1 of ‘free’ discards qualifiers from pointer target type
これはAppleのGCCからのものです:
i686-apple-darwin11-llvm-gcc-4.2 (GCC) 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
したがって、修飾子はvolatile
ではなくconst
.
GCC 4.7.x へのアップグレードを試みる正当な理由の 1 つは、以前のバージョンよりもエラー メッセージが大幅に改善されていることです。改善されたメッセージは 4.6.0 にもあります。4.5.2 のメッセージは古いスタイルで、情報量の少ないメッセージでした。