繁体   English   中英

如何使用#define宏调用特定函数?

[英]how to call particular function using #define macro?

我想根据传递给宏的值调用特定的函数。 但这给了我编译错误

#include <stdio.h>

#define calling(m, j) execcall ## m(j);

void execcall0 (int x) {
    printf("called 0 with arg %d\n", x);
}

void execcall1 (int x) {
    printf("called 1 with arg %d\n", x);
}

void execcall2 (int x) {
    printf("called 2 with arg %d\n", x);
}

int main () {
    int i = 0;
    for (i = 0; i < 3; i++) {
        calling(i, 1);
    }
}

编译错误:

In function `main':
new.c:(.text+0x7a): undefined reference to `execcalli'
collect2: ld returned 1 exit status

我正在尝试的一切甚至有可能吗?

如果要基于整数的值调用函数,最好编写一个指向函数的指针数组,然后使用整数对数组进行索引。

void execcall0(int x); 
void execcall1(int x); 
void execcall2(int x); 

/* Array of pointers to void functions taking an int parameter. */
void (*apfn[])(int) =
{
    execcall0,
    execcall1,
    execcall2, 
};

int main()
{
   int i;
   for (i = 0; i < 3; ++i) {
      (apfn[i])(1);
   }
}

记住在索引之前检查边界条件!

您可以使用数组存储函数,并修改宏:

#include <stdio.h>

#define calling(m, j) exec_funcs[m](j)

void execcall0 (int x) {
    printf("called 0 with arg %d\n", x);
}

void execcall1 (int x) {
    printf("called 1 with arg %d\n", x);
}

void execcall2 (int x) {
    printf("called 2 with arg %d\n", x);
}

void (*exec_funcs[3])(int) = { execcall0, execcall1, execcall2 };

int main () {
    int i = 0;
    for (i = 0; i < 3; i++) {
        calling(i, 1);
    }
}

但是然后,您实际上并不需要宏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM