用于多语句函数的C预处理器语法?
问题描述:
#include <stdio.h>
#define mean(x,N) (double _sum=0.0; for (int _i=0;_i<N;++_i) _sum+=x[_i]; _sum/N)
int main() {
const int N=100;
int i[N]; double d[N];
// here we fill the arrays with data, and then
printf("%f %f %f\n", mean(i,N), mean(d,N));
}
如何在纯C中适当地定义宏,或者如何在不编写两个函数的情况下以另一种方式实现宏?用于多语句函数的C预处理器语法?
答
宏在这种情况下不起作用。
函数的参数必须是表达式。你上面的内容不是一个表达,而是一系列的陈述。你无法绕过你的循环。
只要定义函数,一个接受double *
和int
,另一个是接受int *
和int
,来执行此操作。不要在函数执行时使用宏。
+0
虽然我同意一个函数(或内联函数)会是一个更好的解决方案,但有https://gcc.gnu.org/onlinedocs/gcc/Statement-Exprs.html(如果您的编译器支持它的话)。 – melpomene
答
没有可移植的方式来编写宏来从语句中返回值,特别是复杂的语句。你想用一个宏来实现一个多态的事情...你可以使用C++重载函数来达到这个目的。
对于C,您可以编写一个宏来更新变量并将该变量传递给printf
。请注意,宏是不重要的错误的臭名昭着的来源。
您也可以使用C11通用函数,但通常不支持这些函数。
下面是一个尝试:
#include <stdio.h>
#define set_mean(res,x,N) do { res = 0; for (int i_ = 0; i_ < (N); i_++) res += (x)[i_]; res /= (N); } while (0)
int main(void) {
const int N = 100;
int i[N];
double d[N];
double ires, dres;
// here we fill the arrays with data, and then
set_mean(ires, i, N);
set_mean(dres, d, N);
printf("%f %f %f\n", ires, dres);
}
不能完成。不带循环。 – cleblanc
问题在于,从多语句宏返回值非常非常困难。如果可以将多语句宏构造为单个逗号表达式,那么可以这样做,但是当您这样做时,不能声明任何局部变量,如您在此处需要的'_sum'。 –
两种可能性:(1)gcc有一个扩展,其中一个循环可以返回一个值,以便可以工作。 (2)使用C++和一个模板。 –