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

标签 c concatenation c-preprocessor

我进行了搜索,似乎不可能在 C 中使用 ## 预处理器运算符来执行此操作。

我想使用变量值并创建像 MY_FUNC_3 这样的函数名称

我知道如何使用“#define VALUE 3”并执行此操作,但我如何对变量执行相同的操作。

#define PASTE(x,y) x ## y
#define function (func_name, value) PASTE(x,y)

int a= 3;

for (int a = 2; a < 10; a++)
{
    printf("%s\n", function(MY_FUNC, a))
}

最佳答案

您无法使用预处理器来做到这一点,因为它是在编译之前调用的,因此它不知道任何有关可能的运行时行为的信息。

您可以使用函数数组来解决这个问题,或者更精确地使用函数指针数组来解决这个问题,例如如下所示:

#include <stdio.h>

const char * function1(void)
{
  return "Result 1";
}

const char * function2(void)
{
  return "Result 2";
}

const char * function3(void)
{
  return "Result 3";
}

const char * (*functions[])(void) = {
  function1,
  function2,
  function3,
  NULL
};

int main(void)
{
  size_t i = 0;
  while (NULL != functions[i])
  {
    printf("function[%zu]: '%s'\n", i, functions[i]());
    ++i;
  }
}

结果:

function[0]: 'Result 1'
function[1]: 'Result 2'
function[2]: 'Result 3'

关于c - ## 预处理器运算符和变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48017033/

相关文章:

涉及变量的 C 宏 token 串联 - 这可能吗?

c++ - 字符串连接期间添加的额外字符

c++ - GCC 的 _Pragma 运算符中的预处理器标记粘贴

c - 在 C 中从文件读取大数(例如 e 和 pi)到数组

php - Laravel 上传时如何为图像指定唯一的名称?

c - 变量声明上的函数

c - MinGW 未定义 WIN32,预处理器指令错误

c++ - 替换循环缓冲区/fifo 队列数组元素中的 "FOR()"宏

c++ - GCC 运行时库与 Microsoft Visual C++ 运行时可再发行组件

c - 是什么原因导致 libzmq.dll 崩溃?