c - 是否可以将定义的值用作标识符的一部分?

标签 c c-preprocessor

是否可以在标识符中包含预定义的 id?

标题:

/* myfile.h */
#define func MYID##_func
static void func() {}
#undef func

c文件:

/* myfile.c */
#define MYID FOO
#include "myfile.h"
#undef MYID

#define MYID BAR
#include "myfile.h"
#undef MYID

/* check the functions exist */
void main()
{
    FOO_func();
    BAR_func();
}

我的目标是创建 2 个函数:(FOO_funcBAR_func)。


我尝试编译上面的代码,函数被识别为 MYID_func(因为有 2 个函数而失败)。

我能做到:

#define func FOO_func
#include "myfile.h"
#undef func

...但是当文件有很多标识符时,这并不能很好地扩展,因为它们都必须首先定义。


目标是在同一 C 文件中多次包含该文件时能够避免命名冲突。

最佳答案

您可以使用几层宏来完成您想要的。

/* myfile.h */
#define CONCAT2(A, B) A ## B
#define CONCAT(A, B) CONCAT2(A, B)
#define func() CONCAT(MYID, _func)()
static void func() {}
#undef func

您需要额外的层来确保 MYID 被展开为一个宏。

关于c - 是否可以将定义的值用作标识符的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30739280/

相关文章:

c - nftw 目录的总大小与 du 输出不同

c - Ptheard 会杀死线程函数中分配的空闲动态内存吗?

c++ - 在 C++ 程序中从 C 库调用函数时有什么陷阱吗?

c++ - MSBuild C++ - 命令行 - 可以传递定义吗?

c - double-stringize 技巧究竟是如何工作的?

c - 拒绝指针的数组大小的宏

c - ## 预处理器运算符和变量值

c - 插入mod : error when inserting kernel module

c - 使用 doxygen 文件头作为模块描述

c - 如何使用 header 将多个 c 文件链接在一起?