我需要了解此代码的工作原理:
#define foo1( a ) (a * a) // How does this work?
inline int foo2( int a ) { return (a * a); }
int goo1( int x ) { return foo1(foo2(x)); }
int goo2( int& x ) { return x = foo2(foo1(x)); }
int goo3( int& x, int y ) { return foo2(foo1(y + 1)); }
void goo4( int& x, int y ) { x = foo1(foo2(y + 1)); }
int main(){
int i = 2, j = 1, a = 2+3;
cout << "foo1 = " << foo1( 1+2 ) << "\n"; // How does this work?
cout << "foo2 = " << foo2( 2 + 1 ) << "\n";
cout << "goo1 = " << goo1( i ) << "\n";
cout << "goo2 = " << goo2( j ) << "\n";
cout << "goo3 = " << goo3( i, j ) << "\n"; // How does this work?
goo4( i, j );
cout << " i = " << i << " j = " << j << "\n";
}
但我似乎无法理解这个功能的行为:
#define foo1( a ) (a * a)
因此我不理解这两个函数调用的输出:
foo1( 1+2 )
goo3( i, j )
这是该计划的输出:
foo1 = 5
foo2 = 9
goo1 = 16
goo2 = 1
goo3 = 9
i = 16 j = 1
我不明白为什么foo1的表现不像foo2。有人会向我解释这个#define宏是如何工作的吗?
注意:我不能更改代码,我只是想了解输出。
答案 0 :(得分:2)
嗯,这很简单。
foo1( 1 + 2 )
将变为:
( 1 + 2 * 1 + 2 )
实际上是:
1 + 2 + 2 = 5
这就是宏的工作原理。
答案 1 :(得分:2)
宏不是函数。
宏替换TEXT。所以,当你有
#define foo1( a ) (a * a)
foo1(
... )
的任何实例,其后括号之间的任何内容都将扩展为AS TEXT,而不是表达式。因此,当您foo1( 1 + 2 )
时,它会变为( 1 + 2 * 1 + 2 )
答案 2 :(得分:1)
宏不是一个功能。 编译器将展开所有宏,然后进行编译。要查看扩展代码,可以在gcc:
中使用-E选项使用以下命令gcc -E <source code> -o <preprocessed file name>
或者在Visual C ++中,在Configuration Properties-&gt; C / C ++ - &gt; Preprocessor下,设置“Generate Preprocessed File”。
顺便说一句,你的宏是有问题的。 你应该使用#define foo1( a ) ((a) * (a))
而不是
#define foo1( a ) (a * a)
答案 3 :(得分:0)
不同的是,#define定义的foo1是不是函数,而foo2是。
在编译过程中,编译器会用(parameter *参数)替换代码中的foo1(parameter)关键字。
含义,
cout << "foo1 = " << foo1( 1+2 ) << "\n"; // How does this work
?
将替换为以下代码,
cout << "foo1 = " << ( 1+2 * 1+2 ) << "\n"; // How does this work
?
(因为这里的参数是1 + 2,而不是3。)
结果是1 + 2 * 1 + 2,即5。
现在让我们看看foo2,因为它是内联函数,编译器不会替换它。当您的代码被编译成可执行文件并执行可执行文件时,将首先计算 2 + 1 表达式,然后将结果3传递给foo2()。< / p>
总之,差异实际上在于编译代码。您可能需要更多关于那里发生的事情的知识。