如何在C中将字符串常量转换为预处理标记

时间:2013-05-16 08:03:50

标签: c++ c macros

我想使用宏将字符串常量转换为预处理令牌。 例如:


    // 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:抱歉我的英语不好。
已修改

3 个答案:

答案 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()。