我想打印我的输出,其中只打印出x坐标。
1. printf("sphere{\n");
2. printf("\t<%g %g %g>,\n", V3ARGS(ell->v));
3. printf("//<\n %g \n// %g %g>\n }", V3ARGS(ell->a));
在第三行代码中,在第一个变量之后我放了'//',因为它是注释的标志,即我在输出文件中将第二个和第三个变量打印为注释。 有什么方法可以打印出'x'值,即第一个变量?
答案 0 :(得分:1)
以下是一些可以代表您正在使用的代码的代码,以及一次提取一个参数的宏:
#include <stdio.h>
#define V3ARGS(v) (v).x, (v).y, (v).z
#define ARG_1(x, y, z) (x)
#define ARG_2(x, y, z) (y)
#define ARG_3(x, y, z) (z)
#define ARG1(v) ARG_1(v)
#define ARG2(v) ARG_2(v)
#define ARG3(v) ARG_3(v)
typedef struct Point_3D
{
double x;
double y;
double z;
} Point_3D;;
typedef struct DoublePoint
{
Point_3D a;
Point_3D v;
} DoublePoint;
int main(void)
{
DoublePoint d = { { 1.1, 2.2, 3.3 }, { 4.4, 5.5, 6.6 } };
DoublePoint *ell = &d;
printf("sphere{\n");
printf("\t<%g %g %g>,\n", V3ARGS(ell->v));
printf("//<\n %g \n// %g %g>\n }\n", V3ARGS(ell->a));
printf("a.x = %g\n", ARG1(V3ARGS(ell->a)));
printf("a.y = %g\n", ARG2(V3ARGS(ell->a)));
printf("a.z = %g\n", ARG3(V3ARGS(ell->a)));
printf("v.x = %g\n", ARG1(V3ARGS(ell->v)));
printf("v.y = %g\n", ARG2(V3ARGS(ell->v)));
printf("v.z = %g\n", ARG3(V3ARGS(ell->v)));
return 0;
}
这里的诀窍是两个级别的宏ARG1
和ARG_1
。请注意,ARG1()
只接受一个参数,期望是V3ARGS
的调用,然后调用ARG_1()
。这个技巧将宏参数扩展为ARG_1()
所期望的三个以逗号分隔的参数,然后“返回”这些参数中的第一个。
显示的代码的输出(其中第一个输出是您在问题中显示的代码,在输出结尾处有换行符):
sphere{
<4.4 5.5 6.6>,
//<
1.1
// 2.2 3.3>
}
a.x = 1.1
a.y = 2.2
a.z = 3.3
v.x = 4.4
v.y = 5.5
v.z = 6.6
答案 1 :(得分:0)
正如@JonathanLeffler指出的那样,无论你的V3ARGS(...)
是什么,它都可能是#define
宏,它会解析为逗号列表,如x, y, z
。这意味着如果你说:
printf("some format string here", x, y, z);
您很幸运,因为碰巧传递更少的格式说明符比传递参数更合法:
Passing too many arguments to printf
因此,如果您只想要第一个参数,那么只使用一个说明符:
printf("%g", x, y, z);
如果您只想要第二个,或者仅仅是第三个,那就变得更加棘手。因为没有一般的跳过值的方法;格式说明符按顺序使用(尽管有一个POSIX扩展名可以按编号访问):
Is there a "null" printf code that doesn't print anything, used to skip a parameter?
因此,如果您遇到这样的情况并想要打印z,并且无法修改宏,那么should work in ANSI C99:
typedef struct {
double x,
double y,
double z
} Coordinate;
Coordinate temp;
temp = (Coordinate){ V3ARGS(ell->a) };
printf("%g", temp.z);
这利用了这样一个事实,即结构字段可以通过该分配方式的逗号分隔列表进行初始化。
但是通过查看V3ARGS的定义可能会更好。因为它可能会做类似的事情:
#define V3ARGS(foo) (foo).x, (foo).y, (foo).z
在这种情况下你可以说:
printf("%g", ell->a.z);