C++ C语言中的特定toSquare函数

C++ C语言中的特定toSquare函数,c++,c,macros,C++,C,Macros,我正在为我的大学处理一项非常奇怪的任务。目标是为功能编写一个实现,其工作如下所示: int z = 3; toSquare(2); toSquare(6); toSquare(Incr(z)); toSquare(2+4); /* result : 2 to square is 4. 6 to square is 36. Incr(z) to square is 16. 2+4 to square is 16. */ 我正在考虑使用宏,如第10行所示2+4'是按预期的6打印的,

我正在为我的大学处理一项非常奇怪的任务。目标是为功能编写一个实现,其工作如下所示:

int z = 3;
toSquare(2);
toSquare(6);
toSquare(Incr(z));
toSquare(2+4);       
/* result : 
2 to square is 4.
6 to square is 36.
Incr(z) to square is 16.
2+4 to square is 16.
*/
我正在考虑使用宏,如第10行所示2+4'是按预期的6打印的,所以可以使用宏选项来完成,但我不知道如何处理2+4的平方,结果是2+4的平方是16。感谢所有的想法和解决方案!
干杯

使用宏计算的C语言解决方案:


正确答案包括以下两个原则:

使用宏进行字符串化:这就是预处理器操作符的作用。 使用暗藏的括号操纵参数展开。请注意,2+4*2+4等于16。因此,请用括号括住第一个操作数,而不是第二个操作数! 这将产生以下宏:

#define toSquare(x)    \
    std::cout << #x << " to square is " << (x) * x << std::end;

这是一个。

谁说2+4是印刷的?这只是一个评论。toSquare不应该打印任何内容。编写函数时,调用代码的作用与您无关。特写投票者:可能需要重新阅读。很清楚是什么让他困惑。我可以相信toSquare2+4得到14…toSquare6应该得到36,但toSquare2+4应该返回16,这让我觉得这只是一个打字错误。在运行时,您无法区分这两者。此外,一个好的编译器几乎总是折叠常量表达式,即用6替换2+4。给你的老师写封信。@EitanT是的,我投了更高的票。抢手货我猜老师想让学生们意识到如果不正确使用预处理器会有多危险。对于投票决定关闭的人:不清楚你在问什么,说真的?最多,这属于太本地化的旧模式。无论如何,它不会产生任何输出。
#define toSquare(x)    \
    std::cout << #x << " to square is " << (x) * x << std::end;