【问题标题】:## preprocessor operator and value of a variable## 预处理器运算符和变量的值
【发布时间】:2018-06-09 13:34:36
【问题描述】:

我已经搜索过,似乎在 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))
}

【问题讨论】:

  • 所有预处理器宏将在编译期间被替换。您要实现的目标是在运行时完成。为什么不能用sprintf() 代替?
  • #define function (func_name, value) PASTE(x,y) 应该是#define function (func_name, value) PASTE(func_name, value),但是为什么还要麻烦创建别名呢?
  • 你能手动写出你想要达到的目标吗?我不认为我们期望通过查看代码得到同样的结果。
  • 确实不清楚您希望从中得到什么,但根本问题是预处理器在编译开始时运行,并且不知道变量、循环等。它进行简单的文本替换。你根本无法按照你想做的方式做任何你想做的事情。

标签: c concatenation c-preprocessor


【解决方案1】:

你不能使用预处理器来做到这一点,因为它是在编译之前调用的,所以它对可能的运行时行为一无所知。

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

#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'

【讨论】:

    【解决方案2】:

    你不能用持有一个字符的预处理器值来做到这一点,但你可以这样做:

    #define PASTE_(x, y) x ##y
    #define PASTE(x, y) PASTE_(x, y)
    
    #define value 3
    void PASTE(FuncName, value)()
    {...}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多