在看# and ## in macros之前觉得对#和##宏操作符挺明白的,看了之后才感觉需要重新学习一下。
#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)
int main() {
printf("%s\n",h(f(1,2)));
printf("%s\n",g(f(1,2)));
return 0;
}
如果你能确保自己能写出正确答案的话,那么你可以略过这篇帖子。 C/C++语言中对宏的处理属于编译器预处理的范畴,属于编译期概念而非运行期概念。其中#操作符用于对指定的宏参数进行字符串化,而##操作符用来将两个符号连接为一个符号。
struct command
{
char *name;
void (*function) (void);
};
```
#define COMMAND(NAME) \
{ #NAME, NAME ## _command } struct command commands[] = { COMMAND (quit), COMMAND (help), … };
struct command commands[] = { { “quit”, quit_command }, { “help”, help_command }, … };
#define xstr(s) str(s) #define str(s) #s #define foo 4 str (foo) → “foo” //由于str中对s参数进行字符串化,所以foo不会展开 xstr (foo) → xstr (4) //由于xstr中对foo施加#和##操作符,因此foo先展开为4 → str (4) → “4”
0% |