簡體   English   中英

C-gcc:沒有使用不同的函數聲明/實現的編譯器警告

[英]C - gcc: no compiler warning with different function-declaration/implementation

我試圖弄清楚為什么我的C編譯器使用以下(簡化的)代碼不會給我任何警告/錯誤。

函數聲明沒有參數,而函數實現則具有參數:

some.h:

void foo();

some.c:

static uint32_t count = 0; 

void foo(uint32_t num) {
    count += num;
    print("Count: %u");
}

main.c:

foo(100);
foo();

輸出:

Count: 100
Count: 100

用於目標構建的編譯器:

gcc-arm-none-eabi-4_9-2015q1-20150306-win32

用於目標構建的鏈接器:

gcc-arm-none-eabi-4_9-2015q1-20150306-win32

編譯器標志:

-Wall -Werror -DuECC_CURVE=uECC_secp256r1 -DMEMORY_CHECK -DDEBUG -Os -g3 -DBACKTRACE

由於向后兼容,因此聲明如下

void foo();

沒有聲明不帶參數的函數,而是聲明了帶未知數量的未知類型參數的函數。

這意味着您的兩個調用都是正確的,並且編譯器無法真正警告您。

另一個有問題的是,源文件中的聲明實際上與頭文件中的聲明匹配,只是使其更加精確。 因此,您也不會在那里收到警告或錯誤。

在C中此函數聲明

void foo();

意味着在聲明的地方對函數參數一無所知。

參數的類型和數量從函數調用中得出。

至於你的程序那么這個調用

foo();

具有未定義的行為,因為參數數量和參數數量不匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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