![](/img/trans.png)
[英]No warning from gcc when function definition in linked source different from function prototype in header
[英]No GCC warning for function with declaration different from definition
C文件定義:
#include <stdint.h>
void foo(int i)
{
if(i>0) bar();
}
H文件聲明:
#ifndef FILE_H
#define FILE_H
void foo(void);
#endif FILE_H
主要:
#include "file.h"
int main(void)
{
foo();
}
該file.h
不包括在file.c
某些抽象的原因。 為什么在這種特殊情況下,GCC不會生成任何警告?
如評論中所述…
一般而言, 必須在定義函數和使用函數的位置都包含用於聲明函數的標頭。 您沒有,因此編譯器無法發出警告。 標頭是使編譯器進行必要的交叉檢查以確保代碼基本健康的粘合劑。
問題聲稱:
目前尚不清楚這些抽象原因是什么,但是無論推理如何,都是錯誤的。 由於該問題(尚未)更詳細地說明了問題所在,因此我們無法幫助您解決問題。 但是,它們是虛假的-您做錯了什么。
具體而言,您必須包括file.h
在file.c
以及在main.c
。 否則,您將無法得到所需的交叉檢查或期望的警告。 您還需要file.c
bar()
的原型-在范圍內,沒有原型(嚴格地說,非原型聲明就足夠了,但是您確實想要一個原型),就不應該調用函數,並且沒有原型對於<stdint.h>
或file.h
bar()
。
我使用GCC和選項進行編譯:
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes …
在干凈之前,我不會花時間去運行代碼-實際上, -Werror
意味着直到干凈之前,我才能運行代碼,因為如果有任何警告或錯誤,編譯會失敗。 如果願意,您可以承受更嚴格的要求。 您不應該冒險比這嚴格得多。
請注意,C99和C11都要求在使用之前聲明或定義函數。 僅古老的C90標准允許調用尚未預先聲明或預先定義的功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.