Задать вопрос
@MrBman

Как в языке С: 1) реализуется понятие «inline» функция? 2) возможно ли реализовать общее имя функции для разных типов?

Всем привет! Продолжаю изучать язык С.
1)
Сейчас разбираюсь с макросами, и что можно построить на их основе. Столкнулся с такими понятиями как built-in, inline функции. Если я правильно понимаю, то смысл в том, что если функция достаточна мала и выполняет сравнительно небольшую работу, то гораздо эффективнее будет вставить код этой функции в то место где она используется, чтобы избежать вызова функции? Эту задачу берет на себя сам компилятор? Если да, то как он это реализует?
Например, я смог придумать только такой механизм:
#include <stdio.h>

long unsigned str_len(char const *beg)
{
        char const *end;

        for (end = beg; *end != '\0'; ++end)
                ;
        return end - beg;
}

#define INLINE_STR_LEN(beg, len)                   \
{                                                  \
        char const *end__;                         \
                                                   \
        for (end__ = beg; *end__ != '\0'; ++end__) \
                ;                                  \
        len = end__ - beg;                         \
}

int main(void)
{
        char *str = "Hello, world!";
        long unsigned len;

//      len = str_len(str);
        INLINE_STR_LEN(str, len)
        printf("len = %lu\n", len);

        return 0;
}

Выглядит так себе, да и к тому же имеются очевидные недостатки!
Как правильно, и вообще, Возможно ли это реализовать не в даваясь в детали того как устроен компилятор, Или чтобы провернуть подобное, надо знать как он устроен И уже на основании этого писать расширение для него?:(((
2)
Опять же, копаясь в макросах решил использовать их как шаблоны, для того чтобы получились функции для использования с разными типами:
Вышло как-то так:
fold.c
#include "fold.h"

#define FOLD(N, T, Op)                         \
T N##_##T(T const *a, long unsigned n)         \
{                                              \
        T r;                                   \
                                               \
        for (r = *a++; --n != 0; r Op *a++)    \
                ;                              \
        return r;                              \
}

FOLD(sum    , int   , +=)
FOLD(product, int   , *=)
FOLD(sum    , double, +=)
FOLD(product, double, *=)

fold.h
#ifndef FOLD_H
#define FOLD_H

#define FOLD(N, T) T N##_##T(T const *a, long unsigned n);
        FOLD(sum    , int)
        FOLD(product, int)
        FOLD(sum    , double)
        FOLD(product, double)
#undef  FOLD

#endif

main.c
#include <stdio.h>
#include "fold.h"

#define ISIZE 4
#define DSIZE 5

int main(void)
{
        int    iarr[ISIZE] = { 1  , 2  , 3  , 4 };
        double darr[DSIZE] = { 1.1, 2.2, 3.3, 4.4, 5.5 };

        printf("The sum of iarr: %d\n"    , sum_int       (iarr, ISIZE));
        printf("The sum of darr: %.1f\n"  , sum_double    (darr, DSIZE));
        printf("The product of iarr: %d\n", product_int   (iarr, ISIZE));
        printf("The product of darr: %f\n", product_double(darr, DSIZE));

        return 0;
}

Возможен ли трюк, чтобы я везде использовал функции с одним общим именем sum или это невозможно и надо использовать другой язык?:
sum(iarr, ISIZE);
sum(darr, DSIZE);

P\S Чем больше копаю, тем больше прихожу к выводу, что для того чтобы стать настоящим профессионалом не достаточно просто знать сам язык, надо знать как устроен компилятор для этого языка! Впрочем, если хватит мозгов, то планирую разобраться и в этом, как закончу с самим языком!
  • Вопрос задан
  • 221 просмотр
Подписаться 1 Средний 4 комментария
Пригласить эксперта
Ответы на вопрос 1
@MaM
Хах, а ты веселый малый. Вообшем случае inline это совет компилятору заинлайнить функцию, так же есть штуки специфичные к примеру для гцц или кланга которые требуют сделать это. Но так как люди эти часто злоупотребляли компилятор иногда игнорирует требования программиста. Лучше использовать специальные макросы типа "горячий код" или наоборо "холодный" в спецификации они есть. Касательно реализации шаблонов на языке си, попробуй прямо погуглить templates in c. Техника стара как мир. Вообшем случае такой метод обеспечения полиморфизама конечно используют, но все же лучше использовать какой нибудь void и максимально отказаться от обобшенного кода на си. Большинство прикладных задач покрываются штуками вроде глиба, причем там часто используются макросы с специфичной идиомой примером может служить glib vector
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы