C 使用循环定义的宏

C 使用循环定义的宏,c,macros,C,Macros,我必须将宏模式传递到库中的宏设置字段模式_n是使用模式_one #define mode_one(k, phi) cos(k*x + phi) x在set\u字段中定义phi是一个随机数mode\u n是具有不同k和phi的一系列mode\u one的总和。模式的一个简单示例是 #define mode_n (mode_one(1, 0.5) + mode_one(2, 0.4) + mode_one(3, 0.9)) 有三个术语。如果有几百个这样的术语,那就太乏味了。这就是为什么我希望使用

我必须将宏
模式
传递到库中的宏
设置字段
<代码>模式_n是使用
模式_one

#define mode_one(k, phi) cos(k*x + phi)
x
set\u字段中定义
phi
是一个随机数
mode\u n
是具有不同
k
phi
的一系列
mode\u one
的总和。
模式的一个简单示例是

#define mode_n (mode_one(1, 0.5) + mode_one(2, 0.4) + mode_one(3, 0.9))
有三个术语。如果有几百个这样的术语,那就太乏味了。这就是为什么我希望使用循环定义
mode\u n
。 我希望
n
mode\u n
的一个参数<代码>设置字段
是这样的宏

#define set_field(mode_n) { \
double x, f; \
for (int i = 0; i < 10; i++) { \
    x = i * 10; \
    f = mode_n; \
}
#定义集合字段(模式n){\
双x,f\
对于(int i=0;i<10;i++){\
x=i*10\
f=模式n\
}

是否可以使用C宏定义模式?

是的,您可以在宏中放置一个循环。将其放置在一行或多行中。如果是多行,则需要在行的末尾放置一个转义字符。

是否可以显示类似于您正在谈论的代码的内容?现在还不清楚。宏是纯代码编译时功能,它们被预处理器替换为宏扩展。一旦代码通过预处理器,就不会留下编译器“正确”的宏痕迹请参阅。您正试图将宏传递到
set_字段
,以便
set_字段
可以使用
x
调用您的宏?这是不可能的,宏在编译之前会展开,因此您不能像传递函数一样传递对宏的引用。不要这样编写宏,请非常小心,编写
cos((k)*(x)+(phi))
取而代之的是谷歌为什么。你说“必须是一个未知的
x
宏”是什么意思,如果您的意思是
x
是一个变量,那么您也可以将
x
作为宏参数传递。如果
x
始终是
x
,那么只需使用
mode\u one
样式。但我认为这非常糟糕,因为它使宏的定义毫无意义。而且,您也可以始终使用函数。