如何生成类似于使用 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
所以系统会生成SetSystem1
到SetSystem100
?
是否有一些宏可以创建这样的代码?
我不能使用指向 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 %}
有没有像for
循环这样的C宏,可以生成代码供我使用函数?
例如:
我有
SetSystem1();
SetSystem2();
SetSystem3();
...
SetSystem100();
我可以写吗
#for index = 0 to 100
SetSystem##index();
#endfor
所以系统会生成SetSystem1
到SetSystem100
?
是否有一些宏可以创建这样的代码?
我不能使用指向 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 %}