для многих быстрых задач, где можно использовать функцию f(x,y)
, в простом C используются макросы. Я хотел бы спросить конкретно об этих случаях, которые разрешаются вызовом функции (т. Е. Макросы, используемые для встраивания функций, а не для расширения кода произвольного кода).
Обычно функции C не являются встроенными, поскольку они могут быть связаны с другими файлами C. Однако статические функции C видны только из файла C, в котором они определены. Поэтому они могут быть встроены компиляторами. Я слышал, что многие макросы следует заменить, превратив их в статические функции, потому что это создает более безопасный код.
Есть ли случаи, когда это не очень хорошая идея?
Опять же: не спрашивать о макросах Code-Production с ## одинаковыми конструкциями, которые вообще не могут быть выражены как функция.
inline
функции гарантируют, что он может быть определен несколько раз в двоичном файле, компилятор может решить, будет ли он фактически встроен в него, возможно, для экономии местаinline
, это не о C ++.inline
в C, по крайней мере, с C99. Для быстрого обзора см. Википедию по встроенным функциям .Ответы:
Макросы, которые можно решить с помощью вызова функции, имеют много подводных камней:
++i
.Макросы, которые можно разрешить с помощью вызова функции, могли бы быть полезными для обеспечения встраивания в примитивный компилятор. Я не знаю ни о каком компиляторе, не обрабатывающем встроенные функции, и некоторые могут даже встроить через модули компиляции.
Нет причин, по которым компилятор не сможет предоставить две версии функции: традиционную
call
ed иinline
d. Вы должны посмотреть на документацию компилятора, на который вы нацелены. Кроме того, вы можете захотеть взглянуть на сгенерированную сборку: даже если вы не знаете сборку, вы можете быстро научиться определять, была ли встроена какая-то функция или нет. (Начните с детских примеров, чтобы быстро выучить это.)источник