微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C模板的替代品?

我认为元编程非常酷.特别是,我喜欢lisp宏.

但是,我认为C模板很糟糕,因为:
1.它们减慢了编译时间(即使使用预编译的头文件,如果包含任何STL内容,最终会大到50MB).
2.它们会产生可怕的编译器/语法错误
3.他们首先没有为复杂的元编程设计(为素数生成comipler错误/显示模板是完整的,这在当天是一个大问题).

说了这么多,C元编程有一个不错的选择吗?就像是

* .m – >元编译器 – > * .cpp – > g – >执行?

编辑:

我正在沿着“自定义代码生成脚本”的方向发展.
我只是想知道那里是否有非常好的一套.

解决方法

我不确定这应该是什么,我使用代码生成器来生成C代码.
特别是 python猎豹.你基本上在你的C代码中嵌入了直接的python代码并运行cheetah preprocessor.it允许比使用模板或C预处理器更容易地进行相当复杂的计算,而且你得到所有的python库和扩展.另一方面,如果出现问题,它会使调试变得更难.如果您感兴趣,我可以提供一些示例和Emacs模式来编辑猎豹C程序.

如果你需要不那么强大的东西并且想要只留在C C内,请看一下boost预处理器here.它需要一点时间来适应它,但是当涉及重复代码时可能会让生活变得非常简单

好吧,我正在粘贴猎豹的例子,给我几分钟:

#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
        for(int a = 0; a < $N; ++a) {
            /// for functions in block
%for ii,(fi,fj) in enumerate(fb)
%set i = ii + ifb
/// can also use (ix,iy,iz)=fi[0:2],need to clean up when not lazy
%set ix = fi[0]
%set iy = fi[1]
%set iz = fi[2]
%set jx = fj[0]
%set jy = fj[1]
%set jz = fj[2]
            q$(i) += Ix(a,$(ix),$(jx))*Iy(a,$(iy),$(jy))*Iz(a,$(iz),$(jz));
%end for
            /// end for functions in block
        }

生产(猎豹后……)

#if defined (__INTEL_COMPILER)
#pragma vector aligned
#endif
        for(int a = 0; a < 6; ++a) {
            q0 += Ix(a,1)*Iy(a,0)*Iz(a,0);
            q1 += Ix(a,1,0);
            q2 += Ix(a,0);
            q3 += Ix(a,0);
            q4 += Ix(a,0)*Iy(a,1)*Iz(a,0);
            q5 += Ix(a,0);
            q6 += Ix(a,0);
            q7 += Ix(a,0);
            q8 += Ix(a,1);
            q9 += Ix(a,1);
        }

这是一个常规的C代码

以%开头的行由cheetah预处理器解释为python语句.
///是猎豹评论.认值使用#作为python语句,但我更改了它们以避免与C预处理程序指令冲突. %end必须用于终止python块. C代码中以$开头的变量被python变量替换.

你想要使用boost预处理器的例子吗?

原文地址:https://www.jb51.cc/c/111388.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐