如何生成类似于使用 C 宏的代码? #为了?

How do I generate code like for using a C macro? #for?

有没有像for循环这样的C宏,可以生成代码供我使用函数?

例如:

我有

SetSystem1();
SetSystem2();
SetSystem3();
...
SetSystem100();

我可以写吗

#for index = 0 to 100
    SetSystem##index();
#endfor

所以系统会生成SetSystem1SetSystem100?

是否有一些宏可以创建这样的代码?

我不能使用指向 C 库的数组指针。

C 预处理器中没有这样的工具。鉴于这个工具的复杂性和它的缺点,它没有机会在未来的 C 标准版本中得到扩展。

您可以使用其他工具生成文本并将其包含在源文件中。这是一个使用 bash shell:

的例子
for i in {1..100} ; do echo "    SetSystem$i();" ; done

或者,使用 tr 实用程序:

echo "SetSystem"{1..100}"();" | tr ' ' '\n'

或如 Eric Postpischil 所评论,在 BSD 系统上使用 jot

jot -w '    SetSystem%d();' 100

但是 KamilCuk 找到了一个更简单、最优雅的解决方案:

printf "    SetSystem%d();\n" {1..100}

高级程序员的编辑器拥有强大的宏系统,可让您以交互方式生成相同的输出。

Is there are some macro can create code like this?

不,不是真的。即使你想创建这样的宏,你也必须拼出所有的可能性——100 个案例需要 100 个宏。

您可以使用此类 maros 附带的库,例如 p99 https://gustedt.gitlabpages.inria.fr/p99/p99-html/group__preprocessor__for_gae3eb0e3a5216300874ed6cb9abc170ce.html#gae3eb0e3a5216300874ed6cb9abc170ce :

#define P00_SEP(NAME, I, REC, RES) REC; RES
#define P00_VASSIGN(NAME, X, I)  SetSystem##I()
P99_FOR(A, 101, P00_SEP, P00_VASSIGN, , );

boost https://www.boost.org/doc/libs/1_78_0/libs/preprocessor/doc/index.html :

#define DECL(z, I, text) SetSystem##I();
BOOST_PP_REPEAT_FROM_TO(1, 100, DECL, )

除了 C 预处理器之外,您还可以使用一些外部预处理器。例如 m4:

# forloop.m4, from documentation
divert(`-1')
# forloop(var, from, to, stmt)
define(`forloop',
  `pushdef(`', `')_forloop(`', `', `', `')popdef(`')')
define(`_forloop',
  ``'ifelse(, `', ,
    `define(`', incr())_forloop(`', `', `', `')')')
divert`'dnl

forloop(`i', `1', `100', `dnl
`      SetSystem'i`();
'')

或 php:

<?php for ($i = 1; $i <= 100; $i++) echo "SystemOut".$i."();\n"; ?>

或使用 Python Jinja2:

{% for i in range(1, 100) %}
      SystemOut{{ i }}();
{% endfor %}