C中有多行宏

时间:2017-04-04 14:39:27

标签: c++ macros

有谁知道为什么这在语法上是错误的? 我试图隐瞒这个

    #define OUTS_FROM_FP(_fp, _argCount) ((u4*) ((u1*)SAVEAREA_FROM_FP(_fp) - sizeof(u4) * (_argCount)))

到这个

    #define OUTS_FROM_FP(_fp, _argCount) {\
    ((u4*) ((u1*)SAVEAREA_FROM_FP(_fp) - sizeof(u4) * (_argCount))); \
    cout<<"Hello World"<<endl;  \
    }

    outs = OUTS_FROM_FP(fp, vsrc1); --this is how it is being called

我在运行时遇到很多错误:它们是从那些声明之前传递给宏的变量未使用的语句开始的

2 个答案:

答案 0 :(得分:1)

扩展后,原始宏将如下所示:

outs = ((u4*) ((u1*)SAVEAREA_FROM_FP(fp) - sizeof(u4) * (vsrc)));

(据我所知,因为你没有提供太多上下文)有效的代码。

您修改后的宏会将相同的语句扩展为:

outs = { /* ... */ };

当您尝试将代码块分配给变量时,您的编译器会遇到各种困惑......

除了一般使用宏之外的所有常见警告,你可以使用逗号运算符来获取修改后的宏&#34;工作&#34;:

#define OUTS_FROM_FP( _fp, _argCount ) \
    cout << "Hello world\n", \
    ((u4*) ((u1*)SAVEAREA_FROM_FP(_fp) - sizeof(u4) * (_argCount)))

(输出首先放置,因为逗号运算符分隔的语句评估为 last 语句的结果 - 首先放置输出使宏仍然评估为与原始值相同的值宏。)

总而言之,您可能最好将该宏转变为功能。

答案 1 :(得分:0)

假设_fp_argCount是变量或简单表达式,原始版本是u4*类型的表达式。

第二个更复杂。大括号使它成为一个块,但从语法上讲,你将它用作表达式。这在C ++标准中是不允许的,但是is supported by g++some other compilers。由于您说您正在使用GCC,因此该表达式的值是块的最后一行的值,在本例中为cout<<"Hello World"<<endl。如果您使用的是不支持语句表达式的编译器,则会出现更加混乱的语法错误。

我希望除非您可以将ostream转换为u4指针(根据我们的上下文,似乎不太可能),这不起作用。在这种简单的情况下,您可以通过简单地切换块中行的顺序来修复它。在一个更复杂的情况下,我期望它是最终目标,你可能需要做类似

的事情
#define OUTS_FROM_FP(_fp, _argCount) {\
    u4* result = ((u4*) ((u1*)SAVEAREA_FROM_FP(_fp) - sizeof(u4) * (_argCount))); \
    cout<<"Hello World"<<endl;  \
    result; \
}

这会将宏的输出保存到临时变量,执行您想要的任何计算(可以更改result),然后在最后一行“返回”宏外的result。这比DevSolar’s solution更不便携,但如果你需要创建临时变量,它会更好,而且我认为它更具可读性。

然而,正如其他人在评论中指出的那样,没有什么理由(至少我们可以看到)将其保留为宏而不是将其转换为函数。函数以各种方式更加健壮。您可能仍希望将其保留为宏的原因包括SAVEAREA_FROM_FP更改的定义或u4u1在不同位置的不同类型。这些都不是很好的编程实践,但是你无法控制其他人之前做过的事情,而且我对Dalvik不太了解它并不是这样。