Всем привет! Продолжаю изучать язык С.
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 Чем больше копаю, тем больше прихожу к выводу, что для того чтобы стать настоящим профессионалом не достаточно просто знать сам язык, надо знать как устроен компилятор для этого языка! Впрочем, если хватит мозгов, то планирую разобраться и в этом, как закончу с самим языком!