我想使用宏将字符串常量转换为预处理令牌。 例如:
// get the first character of marco argument to postfix of new data type. #define TYPE(typename) Prefix ## typename #typename[0] void main() { TYPE(int) a, b, c; // Prefixinti a, b, c; TYPE(float) x, y, z; // Prefixfloatf x, y, z; a = 3; }
是否可以在C / C ++中使用?
p / s:抱歉我的英语不好。
已修改
答案 0 :(得分:3)
#define TYPE(first_letter, rest) Prefix ## first_letter ## rest ## first_letter
typedef int TYPE(i,nt);
typedef float TYPE(f,loat);
int main(void)
{
TYPE(i,nt) a, b, c; // Prefixinti a, b, c;
TYPE(f,loat) x, y, z; // Prefixfloatf x, y, z;
}
答案 1 :(得分:1)
你应该记住预处理器的作用,它会在编译器看到它之前修改你的源代码。
这会编译(我删除了int周围的引号),但不是那么有用:
#define TYPE(typename) typename
void main()
{
TYPE(int) a, b, c;
a = 3;
}
您正在做的事情导致以下代码发送到编译器:
TYPE("int") a, b, c;
导致“
"int" a, b, c;
其中字符串常量后跟几个未声明的标识符,这会导致语法错误
答案 2 :(得分:0)
即使使用C ++中的模板,也是不可能的。顺便说一句,避免在C代码中使用'typename',因为它是C ++中的关键字,因此您的C代码很难移植。
虚空main()也不是严格便携的;请改用int main()。