C/C++预处理器连接

use*_*683 5 c++ c-preprocessor

看看这段代码:

#include <iostream>
using namespace std;

#define foo bar

#define string(a) #a
#define concat(a,b) string(a ## b)
#define concat2(a,b) concat(a,b)

int main()
{
    cout << concat(foo, baz) << '\n' << concat2(foo, baz) << endl;
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出是:

foobaz
barbaz
Run Code Online (Sandbox Code Playgroud)

为什么添加额外级别的间接会改变此代码的行为?