在编写C代码(上下文是科学计算)时遇到了很多情况,我将拥有具有完全相同体模的次要类型差异的函数。我意识到C++提供了模板特性和函数重载,它允许只有一个所述函数的副本,并让编译器找出你构建时使用的签名。尽管这是C++中的一个很棒的功能,但我的项目使用C语言,而且我不需要模板的全部功能。到目前为止,我所尝试的是候选源文件上的m4宏,并且这会为每个我需要的不同类型使用恰当的名称修改相应的.c文件。预处理器因此也可以实现这一点,但我试图避免以复杂的方式使用它(我的代码因可重复性原因需要可理解)。我对m4不太好,因此所有的文件都只能在特定情况下使用,并且在新情况下不适用。为不同签名的功能生成C代码,但实现相同
当需要时,其他人在C编程做什么?手动生成和维护函数签名的不同排列?我希望这不是最好的答案,或者有一种工具可以使这种沉闷而容易出错的任务自动化。
对于含糊不清的道歉,让我举一个玩具的例子。假设我需要添加两个数字。如果我需要它适用范围广的类型上的算术可
float add(float x,float y){
return x+y;
}
确定这是伟大的花车,但什么:该功能可能会是这个样子。好吧我可以做到这一点
float add_f(float x,float y){...}
double add_lf(double x,double y){...}
unsigned int add_ui(unsigned int x, unsigned int y){...}
等等。如果对于某些(可能是愚蠢的)原因,我决定我也需要将参数的内容写入二进制文件,现在我必须在每个函数中添加必需的文件I/O代码。是否有一种简单的方法/工具来添加添加功能,并使用名称修饰来吐出不同的名称以避免这种烦人的情况?
基本上在我的m4情况下,我只需找到/用必需的类型替换一个宏类型,并使用一个宏MANGLE()来修改函数,然后将输出指向一个替代的.c文件。虽然我的m4技能缺乏。
函数指针可以帮助我的代码的最终接口,但最终这些指针必须指向某些东西,然后我们再次枚举所有可能的东西。我也不清楚这可能如何影响短职能的潜在内联。
非常模糊和不精确。你能提供[** SSCCE **](http://sscce.org/)吗? – abelenky
复杂的宏是你在C中用于模板类行为的唯一真正的好解决方案。否则一般来说,如果你真的想要C++特有的功能,你需要编写C++代码 – Pyrce
M4是一个很好的预处理器,你可以试着学习更多。但是对于更复杂的代码生成的情况,编写模板文件并编写一个脚本来替代项目需要的脚本通常会更好。 – rodrigo