Не совсем понятно, что здесь псевдокод и реальный код, но в целом вы не должны использовать #define
+ #undef
+ #include
для целей генерации другого кода. (Вы можете сделать это с помощью «X macros», хотя в качестве крайней меры. Не идеальное решение, но лучше, чем это.)
Решение «ВАЖНО - я не хочу звонить функции здесь ", чтобы вызвать функции.
Встраивание функций существовало уже около 30 лет, и 20 лет go C получили явную поддержку языка. И в настоящее время компиляторы намного лучше, чем программисты, чтобы определить, что встраивать. Я приведу пример с явным inline
только для демонстрации того, что вызывающие функции не влияют на производительность, если все сделано правильно.
С традиционным C вы бы сделали что-то вроде этого :
#include <stdio.h>
static inline void SNIP (void)
{
puts(__func__);
}
static inline void A_stuff (int val)
{
printf("%s %d\n", __func__, val);
}
static inline void B_stuff (int val)
{
printf("%s %d\n", __func__, val);
}
typedef enum { A=1, B=2 } AB_t;
void func(AB_t ab, int val)
{
SNIP();
if(ab & A)
A_stuff(val);
if(ab & B)
B_stuff(val);
}
int main()
{
func(A, 10);
func(B, 20);
func(A|B, 30);
printf("Done\n");
return 0;
}
Это нормальное решение. Единственными функциями, которые фактически вызываются в сгенерированном машинном коде, являются func
и функции печати.
В качестве альтернативы, вы могли бы также выполнить генерацию кода с помощью «X-макросов» - они существуют исключительно для того, чтобы избежать повторение кода, за счет читабельности. Не очень рекомендую это здесь, но я приведу пример для полноты:
#include <stdio.h>
#define FUNC_LIST \
X(A, 10) \
X(B, 20) \
X(AB, 30) \
static inline void SNIP (void)
{
puts(__func__);
}
static inline void A_stuff (int val)
{
printf("%s %d\n", __func__, val);
}
static inline void B_stuff (int val)
{
printf("%s %d\n", __func__, val);
}
static inline void AB_stuff (int val)
{
A_stuff(val);
B_stuff(val);
}
#define X(opt, val) void func_##opt (int x) { SNIP(); opt##_stuff(x); }
FUNC_LIST
#undef X
int main()
{
#define X(opt, val) func_##opt(val),
FUNC_LIST
#undef X
printf("Done\n");
return 0;
}
Это довольно нечитабельно, как и оригинальный код, за исключением того, что "X-макросы" являются чем-то де-факто стандартом для icky макрос трюки, чтобы избежать повторения кода.
Это создает несколько функций, как шаблон C ++, поэтому он также не идеален по этой причине.