2
#define SATA_PORT_0   "/sata-ahci/port0"
#define SATA_PORT_1   "/sata-ahci/port1"
#define SATA_PORT_2   "/sata-ahci/port2"
#define SATA_PORT_3   "/sata-ahci/port3"
#define SATA_PORT_4   "/sata-ahci/port4"
#define SATA_PORT_5   "/sata-ahci/port5"

#define SATA_NODE(p)  HOW TO DEFINE THIS?!!

int main() 
{
    int i;
    for (i=0;i<6;i++)
    {
        printf("%s\n", i, SATA_NODE(i));
    }
    return 0;
}

问题:如何定义上述宏,以在 GCC 中打印字符串?

4

5 回答 5

3

你不能轻易地用宏来做到这一点。

问题是宏是编译时构造,而您拥有的循环是运行时构造;你不能直接这样做。

您可以研究Boost Preprocessor(它不是专门用于 C++;它也适用于 C 预处理器)并使用它来编写生成循环的宏。

您可以手动展开循环并使用带有常量参数的宏:

#define SATA_PORT(i) "/sata-ahci/port" #i

printf("%s\n", 0, SATA_PORT(0));
printf("%s\n", 1, SATA_PORT(1));
printf("%s\n", 2, SATA_PORT(2));
printf("%s\n", 3, SATA_PORT(3));
printf("%s\n", 4, SATA_PORT(4));
printf("%s\n", 5, SATA_PORT(5));

或者您可以使用字符串数组(现在已删除的答案也建议使用)。

#define DIM(x) (sizeof(x)/sizeof(*(x)))

const char * const sata_ports[] = 
{
    "/sata-ahci/port0",
    "/sata-ahci/port1",
    "/sata-ahci/port2",
    "/sata-ahci/port3",
    "/sata-ahci/port4",
    "/sata-ahci/port5"
};

for (int i = 0; i < DIM(sata_ports); i++)
    printf("%d %s\n", i, sata_ports[i]);
于 2011-11-10T03:42:35.750 回答
1

感谢以上回答。我自己找到了一种方法。

#define SATA_PORT(p) (p==0)?SATA_PORT_0:ISP1
#define ISP1         (p==1)?SATA_PORT_1:ISP2
...

在某些情况下,上述宏使代码变得更好。

于 2011-11-14T04:18:17.447 回答
1

在 C 语言中你不能。宏替换发生在普通编译之前。预处理器不知道预处理标记 i 稍后将在普通编译期间声明为 int。

执行甚至更晚。编译器可以计算出 i 的值范围是 0 到 5,但这对您没有帮助。实际分配发生在执行期间,即编译完成之后,也就是预处理完成之后。

于 2011-11-10T03:45:48.557 回答
0

编辑:我已经使解决方案更好一点(因为GCC 编译器中可以使用复合语句)。

如果我有类似的问题,我会这样解决:

#define SATA_PORT(p) ({char prt[100]; sprintf(prt, "/sata-ahci/port%d", p); prt;})

顺便说一句,您忘记printf了 variable 的格式说明符i

于 2011-11-14T13:04:14.427 回答
0

也许这就是你需要的(编辑):

#define STRINGIFY(x)                #x
#define TOSTRING(x)                 STRINGIFY(x)
#define SATA_NODE_TO_SATA_PORT(p)   SATA_PORT_##p
#define SATA_NODE(p)                TOSTRING(SATA_NODE_TO_SATA_PORT(p))

然后,如果您尝试使用以下命令打印预处理的宏:

std::cout << SATA_NODE(3) << " - " << SATA_NODE(5) << std::endl;
std::cout << SATA_NODE(7) << std::endl;

你得到的是:

"/sata-ahci/port3" - "/sata-ahci/port5"
SATA_PORT_7
于 2013-03-04T14:11:04.003 回答