他人が書いたC言語のコードを読んでいて以下のようなコードを見つけました。
c
1/** 2 * @file hoge.c 3 */ 4#include <stdio.h> 5void hoge(int x) { 6 printf("x = %d\n", x); 7} 8/** 9 * @file main.c 10 */ 11extern void hoge(void); // Signature is different from definition 12int main(void) { 13 hoge(); 14 return 0; 15}
見ての通り、extern
で取り込んでいる関数hoge
のシグニチャが関数の定義とは異なっています。
上記はC++(g++)ではコンパイルエラーになるのですが、
C(gcc)ではコンパイル通ります。実行するとx=1
と表示されます。
最初、この部分を見つけて「???」と思ったのですが、
gccでコンパイルが通り、clangでも同じように動作するので混乱しています。
(clang++はやはりコンパイルエラー)。
これは正しいコードなのでしょうか。
よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/14 04:19
2019/12/14 14:50