使用##运算符
Using ## operator
我的代码显示:
#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 */
}
代码的可选更改:
#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 */
}
谁能解释一下这段代码是什么意思?这段代码中的 input
是字符串(希望不是)还是变量?如果是变量那么为什么编译器不抛出未声明的变量错误?
它是一个预处理器连接运算符,只能在定义预处理器宏时使用。
举个简单的例子
#define CONCAT(a, b) a ## b
int CONCAT(foo, bar);
在上面的代码中,CONCAT(foo, bar)
的调用将被替换为
int foobar;
input
既不是字符串也不是变量,它是一个预处理标记。
##
是 "token-pasting" 运算符。
第一个宏将newdef(input,5);
扩展为
char inputsumthing[5 * sizeof(str_t)]; str_t *input = (str_t *) intputsumthing;
也就是说,它扩展为一个与第一个参数同名的变量的声明。
您的 "optional changes" 会无条件地命名声明的指针变量 "var1" 并且无法在同一范围内多次使用该宏。
此外,newdef(input,5)="Hello";
会扩展为错误:
char inputsumthing[5 * sizeof(str_t)];
str_t *var1 = (str_t *)inputsumthing = "Hello";
作为旁注,原始宏似乎主要是对
的混淆
str_t inputs[5];
str_t* input = inputs;
我的代码显示:
#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 */
}
代码的可选更改:
#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 */
}
谁能解释一下这段代码是什么意思?这段代码中的 input
是字符串(希望不是)还是变量?如果是变量那么为什么编译器不抛出未声明的变量错误?
它是一个预处理器连接运算符,只能在定义预处理器宏时使用。
举个简单的例子
#define CONCAT(a, b) a ## b
int CONCAT(foo, bar);
在上面的代码中,CONCAT(foo, bar)
的调用将被替换为
int foobar;
input
既不是字符串也不是变量,它是一个预处理标记。
##
是 "token-pasting" 运算符。
第一个宏将newdef(input,5);
扩展为
char inputsumthing[5 * sizeof(str_t)]; str_t *input = (str_t *) intputsumthing;
也就是说,它扩展为一个与第一个参数同名的变量的声明。
您的 "optional changes" 会无条件地命名声明的指针变量 "var1" 并且无法在同一范围内多次使用该宏。
此外,newdef(input,5)="Hello";
会扩展为错误:
char inputsumthing[5 * sizeof(str_t)];
str_t *var1 = (str_t *)inputsumthing = "Hello";
作为旁注,原始宏似乎主要是对
的混淆str_t inputs[5];
str_t* input = inputs;