[英]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.