7

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

    // 获取新数据类型后缀的 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:对不起我的英语不好。
已编辑

4

3 回答 3

4
#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;
}
于 2013-05-16T09:38:46.087 回答
2

您应该始终记住预处理器的作用,它会在编译器看到它之前修改您的源代码。

这确实编译(我删除了 int 周围的引号),但不是很有用:

#define TYPE(typename) typename

void main()
{
    TYPE(int) a, b, c;
    a = 3;
}

您正在执行的操作会导致将以下代码发送到编译器:

TYPE("int") a, b, c;

结果是”

"int" a, b, c;

其中一个字符串常量后跟几个未声明的标识符,这会导致语法错误

于 2013-05-16T08:56:49.253 回答
1

这是不可能的,即使使用 C++ 中的模板也是如此。顺便说一句,避免typename在 C 代码中使用,因为它是 C++ 中的关键字,因此您的 C 代码将难以移植。

也不void main()是严格可移植的;改为使用int main()

于 2013-05-16T08:13:30.533 回答