我想使用宏将字符串常量转换为预处理令牌。例子:
// 获取新数据类型后缀的 marco 参数的第一个字符。 #define TYPE(typename) 前缀 ## typename #typename[0] 无效的主要() { 类型(int)a,b,c;// 前缀 a, b, c; 类型(浮动)x,y,z;// Prefixfloatf x, y, z; a = 3; }
在 C/C++ 中可能吗?
p/s:对不起我的英语不好。
已编辑
#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;
}
您应该始终记住预处理器的作用,它会在编译器看到它之前修改您的源代码。
这确实编译(我删除了 int 周围的引号),但不是很有用:
#define TYPE(typename) typename
void main()
{
TYPE(int) a, b, c;
a = 3;
}
您正在执行的操作会导致将以下代码发送到编译器:
TYPE("int") a, b, c;
结果是”
"int" a, b, c;
其中一个字符串常量后跟几个未声明的标识符,这会导致语法错误
这是不可能的,即使使用 C++ 中的模板也是如此。顺便说一句,避免typename
在 C 代码中使用,因为它是 C++ 中的关键字,因此您的 C 代码将难以移植。
也不void main()
是严格可移植的;改为使用int main()
。