我有一个完全不同的结构,只有一个公共成员 char *desc
,我想打印它们:
#include <stdio.h>
struct foo {
float foo;
char *desc;
};
struct bar {
int barint;
char *desc;
};
int main(int argc, char *argv[]) {
struct foo ff[] = {
{ 1.1, "desc foo 1"}, { 2.2, "desc foo 2"}, { }
};
struct bar bb[] = {
{1, "desc bar 1"}, {2, "desc bar 2"}, {3, "desc bar 3"}, { }
};
const struct foo *f = ff;
const struct bar *b = bb;
int i;
for (i = 0; f[i].desc; i++)
printf("f[%d].desc: '%s'\n", i, f[i].desc);
for (i = 0; b[i].desc; i++)
printf("b[%d].desc: '%s'\n", i, b[i].desc);
return 0;
}
$ ./a.out
f[0].desc: 'desc foo 1'
f[1].desc: 'desc foo 2'
b[0].desc: 'desc bar 1'
b[1].desc: 'desc bar 2'
b[2].desc: 'desc bar 3'
我想要一个宏/函数,它可以将这些结构中的任何一个作为参数(可能不止这两个),并打印 desc
成员。
编辑:定义宏很容易:
#define PRINT_DESC(obj) do { \
for (i = 0; obj[i].desc; i++) \
printf("obj[%d].desc: '%s'\n", i, obj[i].desc); \
} while (0)
但我需要更通用的东西。我想将 const struct bar *b
或 const struct foo *f
(或任何其他结构)分配给另一个内部库结构成员,然后进行打印通过这个库结构成员的库。该成员可能是 void *
,但如何指定将该指针强制转换为哪个结构?
具体示例(抱歉,不是 MCVE):计划在 LTP 中使用它。
tst_test.h
中有 struct tst_test
,我想在其中添加 void *
指向 struct 的指针,其大小与 int test_variants
成员相同。然后在 tst_run_tcases()
中循环打印特定成员的 *desc
:
for (tst_variant = 0; tst_variant < test_variants; tst_variant++) {
if (tst_test->test_variants_desc)
// TODO: print .desc for tst_test->test_variants_desc[tst_variant]
struct tst_test
在测试中定义,例如futex_wait02
,其中 struct futex_test_variants
将被传递,因为它有 char *desc
成员(在 futextest.h
中定义)。
其他测试有不同的结构,这就是它不能指向 struct futex_test_variants
的原因。