用于多语句函数的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预处理器语法?

+0

不能完成。不带循环。 – cleblanc

+0

问题在于,从多语句宏返回值非常非常困难。如果可以将多语句宏构造为单个逗号表达式,那么可以这样做,但是当您这样做时,不能声明任何局部变量,如您在此处需要的'_sum'。 –

+0

两种可能性:(1)gcc有一个扩展,其中一个循环可以返回一个值,以便可以工作。 (2)使用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); 
}