(C99)在不同的宏中扩展一个宏
(C99)Expand a macro in a different macro
我的程序中有一个函数需要 3 个参数。有时在代码中有一个定义其中 2 个参数的宏。
所以这个:
void func(int x, int y, int z){...}
可以这样调用:
#define PAR 10,20
int z = 3;
func(PAR, z);
现在,我需要更改我的代码,以便像调用另一个函数的宏一样调用该函数。
#define func(X,Y,Z) func2(X,Y,Z,#Z)
如果 X 和 Y 确实作为变量传递,则此方法工作正常。有什么方法可以让它与宏 PAR 一起工作吗?
我正在使用 GCC 4.6
不,我不这么认为。当你定义
#define func(X,Y,Z) func2(X,Y,Z,#Z)
您正在定义 function-like macro. func(X,Y,Z) actually takes three arguments - and it has to take three arguments。请记住,预处理器而不是编译器正在解释func(PAR, Z).
我一直在努力寻找任何文档,但预处理器要做的第一件事(考虑到 func() 是外部元素)是有道理的查看 func() 的参数是否有效。然后它会将参数放入 func2(),然后展开作为参数传递的所有宏。我在下面放置的代码似乎支持了这一说法。
按照这个逻辑,预处理器会发现 func(PAR, Z) 不是一个有效的调用,因为缺少一个参数,然后会抛出错误
13:12: error: macro "func" requires 3 arguments, but only 2 given
func(X, Y, Z) 只要 X 和 Y[=40= 就可以工作] 是有效的宏或变量。
代码(这会给你警告,因为没有函数声明,但输出将是“3 14 3”预期):
#include <stdio.h>
#include <stdlib.h>
#define PAR 10,20
#define MAR 3
#define WAR 14
#define func(X,Y,Z) print(X, Y, Z)
int Z = 3;
int main(void){
func(MAR,WAR,Z);
return 0;
}
void print(int x, int y, int c){
printf("%d %d %d\n", x, y, c);
}
出于好奇,你为什么要这样做(我还没有足够的声誉来发表评论,仅供参考)。
您可以使用额外的间接级别(ab)使用可变参数来做到这一点
宏:
#include <stdio.h>
#define PAR 2,3
#define F(...) G(__VA_ARGS__)
#define G(a,b,c) H(a,b,c)
void H(int a, int b, int c) {
printf("%d %d %d\n", a , b, c);
}
int main() {
F(PAR, 42);
return 0;
}
潜在问题可能有更好的解决方案。
我的程序中有一个函数需要 3 个参数。有时在代码中有一个定义其中 2 个参数的宏。
所以这个:
void func(int x, int y, int z){...}
可以这样调用:
#define PAR 10,20
int z = 3;
func(PAR, z);
现在,我需要更改我的代码,以便像调用另一个函数的宏一样调用该函数。
#define func(X,Y,Z) func2(X,Y,Z,#Z)
如果 X 和 Y 确实作为变量传递,则此方法工作正常。有什么方法可以让它与宏 PAR 一起工作吗?
我正在使用 GCC 4.6
不,我不这么认为。当你定义
#define func(X,Y,Z) func2(X,Y,Z,#Z)
您正在定义 function-like macro. func(X,Y,Z) actually takes three arguments - and it has to take three arguments。请记住,预处理器而不是编译器正在解释func(PAR, Z).
我一直在努力寻找任何文档,但预处理器要做的第一件事(考虑到 func() 是外部元素)是有道理的查看 func() 的参数是否有效。然后它会将参数放入 func2(),然后展开作为参数传递的所有宏。我在下面放置的代码似乎支持了这一说法。
按照这个逻辑,预处理器会发现 func(PAR, Z) 不是一个有效的调用,因为缺少一个参数,然后会抛出错误
13:12: error: macro "func" requires 3 arguments, but only 2 given
func(X, Y, Z) 只要 X 和 Y[=40= 就可以工作] 是有效的宏或变量。
代码(这会给你警告,因为没有函数声明,但输出将是“3 14 3”预期):
#include <stdio.h>
#include <stdlib.h>
#define PAR 10,20
#define MAR 3
#define WAR 14
#define func(X,Y,Z) print(X, Y, Z)
int Z = 3;
int main(void){
func(MAR,WAR,Z);
return 0;
}
void print(int x, int y, int c){
printf("%d %d %d\n", x, y, c);
}
出于好奇,你为什么要这样做(我还没有足够的声誉来发表评论,仅供参考)。
您可以使用额外的间接级别(ab)使用可变参数来做到这一点 宏:
#include <stdio.h>
#define PAR 2,3
#define F(...) G(__VA_ARGS__)
#define G(a,b,c) H(a,b,c)
void H(int a, int b, int c) {
printf("%d %d %d\n", a , b, c);
}
int main() {
F(PAR, 42);
return 0;
}
潜在问题可能有更好的解决方案。