如何在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++ 中无效

C++ 不推荐将字符串常量转换为 'char*'

如何摆脱 GCC 中“从字符串常量到‘char*’的不推荐转换”警告?

将常量的字符串表示形式转换为常量?

在 PySpark 中将字符串常量添加为列时未解析的引用点亮

将 C 或 C++ 常量转换为 Java