【问题标题】:how to convert string constant to preprocessing token in C如何在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) 中的第一个字符添加到我的数据类型的后缀。

标签: c++ c macros


【解决方案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宏,
猜你喜欢
  • 2010-09-19
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
  • 2022-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多