如何在C中将字符串常量转换为预处理标记
Posted
技术标签:
【中文标题】如何在C中将字符串常量转换为预处理标记【英文标题】:how to convert string constant to preprocessing token in C 【发布时间】:2013-05-11 00:40:12 【问题描述】:我想使用宏将字符串常量转换为预处理标记。 示例:
// 获取新数据类型后缀的 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:对不起我的英语不好。 已编辑
【问题讨论】:
你不能取消字符串化,只能字符串化。 但这应该是你所需要的,只要你的常量不包含逗号。 非常努力,但无法抗拒:为什么要这样做? 我想使用 X 宏创建用户定义的数据类型。示例:在 OpenGL 中。 GLPoint3i, GLPoint3f : 将数据类型 (int , float) 中的第一个字符添加到我的数据类型的后缀。 【参考方案1】:这是不可能的,即使使用 C++ 中的模板也是如此。顺便说一句,避免在 C 代码中使用 typename
,因为它是 C++ 中的关键字,因此您的 C 代码将难以移植。
另外void main()
不是严格可移植的;请改用int main()
。
【讨论】:
typename
没有区别,因为预处理器在编译器之前运行。
对,但你不觉得很淘气吗?【参考方案2】:
#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;
【讨论】:
您有更好的解决方案吗?我要TYPE(int) a, b, c;// Prefixiniti a, b, c;
不,我不知道其他解决方案。【参考方案3】:
您应该始终记住预处理器的作用,它会在编译器看到之前修改您的源代码。
这确实编译(我删除了 int 周围的引号),但不是很有用:
#define TYPE(typename) typename
void main()
TYPE(int) a, b, c;
a = 3;
您正在执行的操作会导致将以下代码发送到编译器:
TYPE("int") a, b, c;
结果”
"int" a, b, c;
其中一个字符串常量后跟几个未声明的标识符,这会导致语法错误
【讨论】:
我想使用 X 宏创建用户定义的数据类型。示例:在 OpenGL 中。 GLPoint3i, GLPoint3f : 将数据类型 (int , float) 中的第一个字符添加到我的数据类型的后缀中。 我认为 openGL 变量是使用 typedef 创建的。看看en.wikipedia.org/wiki/X_Macro这里你可以看到如何使用X宏,以上是关于如何在C中将字符串常量转换为预处理标记的主要内容,如果未能解决你的问题,请参考以下文章
为啥从字符串常量转换为 'char*' 在 C 中有效但在 C++ 中无效
如何摆脱 GCC 中“从字符串常量到‘char*’的不推荐转换”警告?