LINUX.ORG.RU

[ANSI C] Расширение Си.

 


0

2

Мне не хватает выразительности сишных макросов. В то же время, я хочу чтобы код был ANSI C.

Существует ли какой advanced препроцессор, макры поумнее для ANSI C? Или вообще, расширение какое (надстройка). Возможно даже небольшой язык транслирующийся в обычный Си.

Я не собираюсь городить мега абстракцию (а-ля C++), просто мне бы пригодилась небольшая возможность кодогенерации.

Необходимый функционал: что-то вроде макр (с защитой от variable capture).

Уверен, что кто-нибудь сделал, не хочу велосипедить.

Ответ на: комментарий от vladimir-vg

> с возможностью генерить уникальные идентификаторы

сам генерь, тоже мне проблема…

$ uuidgen | sed 's/-//g;s/^/tmp_/'
arsi ★★★★★
()
Ответ на: комментарий от dmsh

ну хз, я обхожусь просто:

#define my_macro_name(a)  do { \
        int my_macro_name_tmpvar1 = (int)(a); \
        foo(my_macro_name_tmpvar1 * my_macro_name_tmpvar1 + 1); \
    }while(0)

или я просто не понял целей ТС-а…

arsi ★★★★★
()
Ответ на: комментарий от mono

> а зачем? чего именно не хватает?

К примеру есть один кусок кода, который исполняется очень часто. (Читай горячая точка).

Мне так необходимо вызывать одну функцию, которая вообще говоря может быть вычислена в compile-time.

Ещё у меня есть несколько функций, которые почти одинаковы, за исключением одного блока кода. Пригодилось бы что-то вроде лиспового with макра.

vladimir-vg ★★
() автор топика
Ответ на: комментарий от arsi

Он хочет генерировать эти вот my_macro_name_tmpvar1 автоматом, аналог лисперского gensym.

Как-то так чтоли:

define(current, 0)
define(gensym, ``id_'current define(`current', incr(current))')

gensym()
gensym()
gensym()
напечатает
id_0 
id_1 
id_2

dmsh
()
Ответ на: комментарий от arsi
use strict;
use warnings;
require libgtdsc_pl::list_g;

list_g::BeginGeneration();

print list_g::Generate_List_Type('I_NG','int');

print list_g::Generate_List_Type('I','int',5);

print list_g::Generate_List_Type('SomeC','Some',0,SomeInitor,SomeDeInitor);

list_g::EndGeneration();

в результате выполнения генерируется файл .h содержащий дефиниции трех контейнеров, один list с int'ами второй list с int'ами который предвыделяет по 5% дополнительных элементов и третий list с блекджеком

ACR
()
Ответ на: комментарий от Led

There are built-in macros for use with ... LaTeX ... Prolog

Вот чудные. Зачем?

dmsh
()
Ответ на: комментарий от vladimir-vg

Я подпилил, кстати, свой пример, теперь можно указывать префиксы. Красотища!

define(`let', `pushdef(`$1',`$2')$3 popdef(`$1')')

define(`get_counter', `define(`$1', ifdef(`$1', `incr($1)', 0))$1')

define(`gensym', `let(`sym_prefix', `ifelse($1,`',`id',$1)',
                    `let(`sym_counter', `sym_prefix`_counter'',
                       `sym_prefix`_'get_counter(sym_counter)')')')


gensym    gensym(var)    gensym(func)
gensym    gensym(var)    gensym(func)
gensym    gensym(var)    gensym(func)

выхлоп:

id_0      var_0      func_0  
id_1      var_1      func_1  
id_2      var_2      func_2

dmsh
()
Ответ на: комментарий от vladimir-vg

> Мне так необходимо вызывать одну функцию, которая вообще говоря может быть вычислена в compile-time.

Почему бы просто не вычислить эту функцию средствами системы сборки, например, cmake?

Ещё у меня есть несколько функций, которые почти одинаковы, за исключением одного блока кода.

В этом случае лучше отрефакторить код. Либо разбить функцию на несколько логических частей, либо вынести общий код в отдельную функцию и вызывать общую функцию из исходных нескольких функций с передачей нужных колбэков.

Sorcerer ★★★★★
()
Ответ на: комментарий от dmsh

> Он хочет генерировать эти вот my_macro_name_tmpvar1 автоматом

ну, может тогда вот так:

<?php $n = 1234567; $v = "tmp$n" ?>

#define my_macro_1(a)  do { \
        int <?php echo $v ?> = (int)(a); \
        foo(<?php echo $v ?> * <?php echo $v ?> + 1); \
    }while(0)

<?php ++$n; $v = "tmp$n" ?>

#define my_macro_2(a)  do { \
        int <?php echo $v ?> = (int)(a); \
        foo(<?php echo $v ?> * <?php echo $v ?> - 1); \
    }while(0)
$ php my_header.h.php > my_header.h

;)

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.