crypt of decay - половые акты с препроцессором в необычных позах [entries|archive|friends|userinfo]
ketmar

[ userinfo | ljr userinfo ]
[ archive | journal archive ]

половые акты с препроцессором в необычных позах [Aug. 25th, 2013|10:54 am]
Previous Entry Add to Memories Tell A Friend Next Entry
ПРЕДУПРЕЖДЕНИЕ: кто ходит в гости по утрам использует такой код — гад, скотина, мудак и долбоёб.

Итак. Есть у нас язык «C». Делаем мы на нём какую-то унылую ерунду, и хотим мы, чтобы конструктор некоторого объекта (пусть это будет «бесполезная точка») существовал в трёх вариантах: без аргументов, с одним аргументом и с двумя аргументами. Можно, конечно, каждый раз руками делать что-то типа point_new_empty(), point_new_x(x), point_new_xy(x, y). А можно сделать извращение и поабузить препроцессор. Вот так, например:

#define _X_VA_XARGS_IMPL(_1, _2, _3, _4, N, …) N
#define _X_VA_XARGS(…) _X_VA_XARGS_IMPL(__VA_ARGS__, _bad, _2a, _1a, _0a)

#define _X_POINT_NEW_IMPL2(_pfx,_sfx, …) _pfx ## _sfx (__VA_ARGS__)
#define _X_POINT_NEW_IMPL(_pfx,_sfx, …) _X_POINT_NEW_IMPL2(_pfx,_sfx, __VA_ARGS__)
#define point_new(…) _X_POINT_NEW_IMPL(point_new, _X_VA_XARGS(_nothing_, ##__VA_ARGS__), __VA_ARGS__)

#include <stdio.h>
#include <stdlib.h>

static void point_new_0a (void) { printf("point_new(undef, undef)\n"); }
static void point_new_1a (int n0) { printf("point_new(%d, undef)\n", n0); }
static void point_new_2a (int n0, int n1) { printf("point_new(%d, %d)\n", n0, n1); }

int main () {
point_new();
point_new(42);
point_new(42, 666);
return 0;
}


да-да-да, я знаю: извращенцы отаке. Но работает. Ах, да: учтите, что трюк «##__VA_ARGS__» — это специфичная для гнутого препроцессора фича. Без этой фичи отдетектить отсутствие аргументов тоже можно, но ебанётесь на отличненько.

Для тех, кто не врубился, отчего так дохуя макросов: специфика препроцессорной «развёртки», так надо. Читайте доки, они рулят. А кто не использует gcc — тот сам дурак и пусть сосёт бензин.
Linkmeow!

Comments:
From:(Anonymous)
Date:August 26th, 2013 - 09:30 am
(Link)
> хотим мы, чтобы конструктор некоторого объекта (пусть это будет
> «бесполезная точка») существовал в трёх вариантах: без аргументов, с одним
> аргументом и с двумя аргументами
для этого люди придумали няшный prolog например
[User Picture]
From:[info]ketmar
Date:August 26th, 2013 - 09:39 am
(Link)
Для особо тугих повторяю: есть у нас язык «C»…
From:(Anonymous)
Date:August 26th, 2013 - 09:53 am
(Link)
та я к тому, что глупо рыть окопы зубочисткой: нафиг нам вообще использовать язык "С" для имплеменирования подобных вещей?
[User Picture]
From:[info]ketmar
Date:August 26th, 2013 - 10:12 am
(Link)
Потому что даден «С». Чо ниясна?
From:(Anonymous)
Date:August 26th, 2013 - 10:36 am
(Link)
ниясна где мозг у давальщика. на момент давания разве небыло ясно что надо будет делать?
вечно у вас аналитика в жопе.
[User Picture]
From:[info]ketmar
Date:August 26th, 2013 - 11:08 am
(Link)
Ну вперёд, чо. Напиши, например, libre9 в те же размеры, с теми же зависимостями, скоростью и бинарным оверхедом.
From:(Anonymous)
Date:August 26th, 2013 - 12:04 pm
(Link)
я, конечно, не вижу всей задачи, но всё то, с чем приходится сталкиваться irl, имеет/имело пониженный приоритет касательно первого, второго, и последнего.
[User Picture]
From:[info]ketmar
Date:August 26th, 2013 - 11:09 am
(Link)
И вообще. Я тут трюк красивый написал — не, надо прийти и обгадить. На кое-чём другом и такого нельзя.
From:(Anonymous)
Date:August 26th, 2013 - 12:34 pm
(Link)
> надо прийти и обгадить
ну прости, я ж не со зла :)
From:(Anonymous)
Date:August 26th, 2013 - 01:08 pm
(Link)
специфичная для гнутого препроцессора фича

-std=c99 -Wall -pedantic

ХУЙЦОВ НЕСТАНДАРТОПЕТУХАМ
[User Picture]
From:[info]ketmar
Date:August 26th, 2013 - 03:06 pm
(Link)
Стандартодрочеры как обычно кукарекают и сосут. Лично я знаю один стандарт: gnu99.
From:(Anonymous)
Date:August 27th, 2013 - 01:22 am
(Link)
-ansi -Wall -Werror -pedantic

Умрите, еретики.
From:(Anonymous)
Date:August 28th, 2013 - 01:58 am
(Link)
Тащемта, твоя хуита и без гну получается, не считая случая с нулем аргументов. Но кому нужна функция с нулем аргументов? Что вообще может быть в функции с нулем аргументов? Нихуя хорошего там быть не может, вот что. Так что она на хуй не нужна.