有谁知道为什么这在语法上是错误的? 我试图隐瞒这个
#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
我在运行时遇到很多错误:它们是从那些声明之前传递给宏的变量未使用的语句开始的
答案 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
更改的定义或u4
和u1
在不同位置的不同类型。这些都不是很好的编程实践,但是你无法控制其他人之前做过的事情,而且我对Dalvik不太了解它并不是这样。