Да, возможно, но вы это делаете не правильно.
#define PORTB 0x04
#define PORTB0 0
void bit_set(uint8_t port, uint8_t bit)
{
port |= (1 << bit);
}
int main(void)
{
bit_set(PORTB, PORTB0);
}
Здесь вообще ничего не делается, это же void функция. Если поменять её тип на uint8_t и добавить return, то компилятор всё равно оставит и функцию и её вызов, потому что она не объявлена статической, а значит может вызываться откуда-то ещё.
#include <stdint.h>
#include <stdio.h>
#define PORTB 0x04
#define PORTB0 0
// вызов функции останется
uint8_t bit_set(uint8_t port, uint8_t bit)
{
return port |= (1 << bit);
}
int main(void)
{
uint8_t res = bit_set(PORTB, PORTB0);
printf("%hhd\n", res);
}
Если же сделать функцию статической, то её вызов будет заинлайнен, но лучше тогда сразу static inline использовать:
#include <stdint.h>
#include <stdio.h>
#define PORTB 0x04
#define PORTB0 0
// А вот так функция будет заинлайнена
static inline uint8_t bit_set(uint8_t port, uint8_t bit)
{
return port |= (1 << bit);
}
int main(void)
{
uint8_t res = bit_set(PORTB, PORTB0);
printf("%hhd\n", res);
}
И да, чтобы переиспользовать static inline функции, их надо объявлять в заголовочных файлах, объявить прототип в заголовочном файле, а тело в .c файле не выйдет.
Рекомендую проверить самостоятельно с помощью
https://godbolt.org. Не забудьте, что без указания флагов оптимизации, ничего заинлайнено не будет, даже если объявить функцию, как static inline