2016-09-09 11 views
1

Я пытаюсь понять, почему мой c-компилятор не дает мне никаких предупреждений/ошибок со следующим (упрощенным) кодом.C - gcc: предупреждение компилятора с другой функцией-декларация/реализация

Функция декларирование не имеют параметров, а функция-реализация имеет параметры:

some.h:

void foo();

some.c:

static uint32_t count = 0; 

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

май n.c:

foo(100); 
foo(); 

Выход:

Count: 100 
Count: 100 

Компилятор для целевой сборки:

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

Linker для целевой сборки:

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

компилятором Флаги:

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

+0

Ваше заявление о компиляции? включает? –

+0

Я предполагаю, что 'print'' 'printf'.BTW [UB] (https://en.wikipedia.org/wiki/Undefined_behavior) - [UB] (https://en.wikipedia.org/wiki/Undefined_behavior) – LPs

+0

Вопросы поиска справки по отладке («почему это не так» код работает? ») должен включать в себя желаемое поведение, конкретную проблему или ошибку и кратчайший код, необходимый для воспроизведения в самом вопросе. Вопросы без четкого описания проблемы не полезны другим читателям. См.: Как создать минимальный, полный и проверенный пример. – Olaf

ответ

0

В C эта функция декларации

void foo(); 

означает, что ничего не известно о параметрах функции в точке декларации.

Типы и количество параметров выводятся из вызова функции.

Что касается вашей программы, то этого вызова

foo(); 

имеет неопределенное поведение, так как число параметров и число несоответствия аргументов.

4

Из-за обратной совместимости, декларация, как

void foo(); 

не объявляет функцию, которая не принимает никаких аргументов, он объявляет функцию, которая принимает неизвестное количество аргументов неизвестного типа.

Это означает, что оба ваших звонка верны, и компилятор не может вас предупредить об этом.

Другая проблема заключается в том, что декларация в исходном файле фактически соответствует объявлению в заголовочном файле, это только делает ее более точной. Поэтому вы также не получите предупреждение или ошибку.

+5

- это объявление функции, которая не принимает аргументов: 'void foo (void);' –