C 使用##运算符

C 使用##运算符,c,gcc,c-preprocessor,C,Gcc,C Preprocessor,我有一个密码,上面写着: #include<stdio.h> typedef struct string{ char *ch_ptr; }str_t; #define newdef(a,b) \ char a ## sumthing[b * sizeof(str_t)]; \ str_t *a = (str_t *)a ## sumthing main(){ newdef(input,5); /* some lines of co

我有一个密码,上面写着:

#include<stdio.h>

typedef struct string{
    char *ch_ptr;
}str_t;

#define newdef(a,b) \
    char a ## sumthing[b * sizeof(str_t)]; \
    str_t *a = (str_t *)a ## sumthing

main(){
    newdef(input,5);
    /*     some lines of code */
}
#包括
typedef结构字符串{
char*CHU ptr;
}结构;
#定义新定义(a,b)\
字符a##sumthing[b*sizeof(stru#t)]\
str_t*a=(stru t*)a#sumthing
main(){
newdef(输入,5);
/*一些代码行*/
}
代码的可选更改:

#include<stdio.h>

typedef struct string{
    char *ch_ptr;
}str_t;

#define newdef(a,b) \
    char a ## sumthing[b * sizeof(str_t)]; \
    str_t *var1 = (str_t *)a ## sumthing

main(){
    newdef(input,5)="Hello";
    printf("%s\n",input);
    /*     some lines of code */
}
#包括
typedef结构字符串{
char*CHU ptr;
}结构;
#定义新定义(a,b)\
字符a##sumthing[b*sizeof(stru#t)]\
str_t*var1=(stru t*)a#sumthing
main(){
newdef(输入,5)=“你好”;
printf(“%s\n”,输入);
/*一些代码行*/
}

有人能解释一下这个代码段的意思吗?此代码中的
input
是字符串(希望不是)还是变量?如果是一个变量,那么编译器为什么不抛出一个未声明的变量错误?

它是一个预处理器连接运算符,只能在定义预处理器宏时使用

让我们举一个简单的例子

#define CONCAT(a, b) a ## b

int CONCAT(foo, bar);
在上述代码中,
CONCAT(foo,bar)
的调用将替换为

int foobar;

它是一个预处理器连接运算符,只能在定义预处理器宏时使用

让我们举一个简单的例子

#define CONCAT(a, b) a ## b

int CONCAT(foo, bar);
在上述代码中,
CONCAT(foo,bar)
的调用将替换为

int foobar;

input
既不是字符串也不是变量,它是一个预处理令牌

##
是“令牌粘贴”操作符

第一个宏展开
newdef(输入,5)进入

char inputsumthing[5 * sizeof(str_t)]; str_t *input = (str_t *) intputsumthing;
也就是说,它扩展为一个名为第一个参数的变量声明

您的“可选更改”将无条件地将声明的指针变量命名为“var1”,并使宏无法在同一范围内多次使用。
另外,
newdef(输入,5)=“Hello”将扩展为错误:

char inputsumthing[5 * sizeof(str_t)]; 
str_t *var1 = (str_t *)inputsumthing = "Hello";
作为旁注,原始宏似乎主要是对

str_t inputs[5];
str_t* input = inputs;

input
既不是字符串也不是变量,它是一个预处理令牌

##
是“令牌粘贴”操作符

第一个宏展开
newdef(输入,5)进入

char inputsumthing[5 * sizeof(str_t)]; str_t *input = (str_t *) intputsumthing;
也就是说,它扩展为一个名为第一个参数的变量声明

您的“可选更改”将无条件地将声明的指针变量命名为“var1”,并使宏无法在同一范围内多次使用。
另外,
newdef(输入,5)=“Hello”将扩展为错误:

char inputsumthing[5 * sizeof(str_t)]; 
str_t *var1 = (str_t *)inputsumthing = "Hello";
作为旁注,原始宏似乎主要是对

str_t inputs[5];
str_t* input = inputs;

#define
创建一个预处理器宏(如果不知道它是什么,请查阅)。在这种情况下,宏被称为
newdef
,它有两个参数<代码>a
b
newdef(input,5)
被扩展到宏定义(
char a###[…]
),每次出现
a
都被扩展到
input
,每个
b
都被扩展到
5
##
是一个串联运算符,因此
一个###sumthing
会变成
输入sumthing
(在本例中)。#只是预处理器串联运算符,如果这是您的问题:)
#define
创建一个预处理器宏(如果不知道它是什么,请查看)。在这种情况下,宏被称为
newdef
,它有两个参数<代码>a
b
newdef(input,5)
被扩展到宏定义(
char a###[…]
),每次出现
a
都被扩展到
input
,每个
b
都被扩展到
5
##
是一个串联运算符,因此
a###sumthing
会变成
inputsumhing
(在本例中)。#如果您有问题,它只是预处理器串联运算符:)