Это ошибка ag cc?
Нет.
abs
- это функция, определенная в стандарте C, ее прототип представлен как int abs (int)
by #include <stdlib.h>
.
Однако, даже без включения этого заголовка, g cc обладает встроенными знаниями о abs
и знает, что он должен делать. Это относится к хосту C, который используется большинством пользователей.
В не хосте C однако компилятор не должен делать никаких предположений относительно семантики функций, объявленных в стандартных заголовках. В g cc вы получаете не колеблясь, соотв. отдельно -freestanding
.
Кроме того, даже без включенной оптимизации (-O0
), g cc будет складывать константы. Это связано с тем, что в
int x = 1 + 2;
вы не можете выполнить инициализацию во время выполнения для x
в хранилище stati c - в отличие от C ++, который может инициализировать это во время выполнения в принципе. В вашем случае
abs (-5)
складывается в 5
.
Поскольку вы, скорее всего, не хотите использовать -ffreestanding
, вы можете использовать -fno-builtin-abs
, чтобы убрать встроенный знание о abs
, то же самое для многих других функций. Даже с опцией -fno-builtin-abs
вы можете использовать __builtin_abs
в своем коде, если вы предпочитаете оптимизированную версию вычисления абсолютного значения, а не libcall, libc.a
/ libc.so
.
Приложение Отдельно стоящее объявление из-за комментария: C99 §4 Соответствие, говорит:
Две формы соответствующей реализации размещены и автономны. соответствующая размещенная реализация принимает любую строго соответствующую программу. соответствующая автономная реализация должна принимать любую строго соответствующую программу, которая не использует сложные типы и в которой использование функций, указанных в разделе библиотеки (пункт 7), ограничено содержимым стандартных заголовков <float.h>
, <iso646.h>
, <limits.h>
, <stdarg.h>
, <stdbool.h>
, <stddef.h>
и <stdint.h>
.