簡體   English   中英

沒有聲明與定義不同的功能的GCC警告

[英]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中。

目前尚不清楚這些抽象原因是什么,但是無論推理如何,都是錯誤的。 由於該問題(尚未)更詳細地說明了問題所在,因此我們無法幫助您解決問題。 但是,它們是虛假的-您做錯了什么。

具體而言,您必須包括file.hfile.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM