我不理解C ++中#define宏的行为

时间:2017-10-31 23:53:33

标签: c++ macros const

我需要了解此代码的工作原理:

#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宏是如何工作的吗?

注意:我不能更改代码,我只是想了解输出。

4 个答案:

答案 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>

总之,差异实际上在于编译代码。您可能需要更多关于那里发生的事情的知识。