如何避免在多态打印宏中使用 #if

2024-02-01

让我们尝试运行以下代码:

#include <stdio.h>
#define MY_MACRO1(isArray,y) do { \
                      if(isArray) \
                        printf("%d", y[0]); \
                      else \
                        printf("%d", y); \
                     }while(0)

int main()
{
    int a = 38;
    int b[]={42};

    MY_MACRO1(0,a);

    return 0;
}

它返回错误:

main.c: In function ‘main’:
main.c:12:39: error: subscripted value is neither array nor pointer nor vector
                         printf("%d", y[0]); \

好的,所以只有当变量是数组时,我们才需要 #if 语句来运行 y[0]:

#define MY_MACRO2(isArray,y) do { \
                      #if isArray \
                      printf("%d", y[0]); \
                      #else \
                      printf("%d", y); \
                      #endif \
                     }while(0)

int main()
{
    int a = 38;
    int b[]={42};

    MY_MACRO2(0,a);

    return 0;
}

但它返回:

main.c:11:28: error: '#' is not followed by a macro parameter
 #define MY_MACRO2(isArray,y) do { \

有没有办法在宏中调用#if 语句? 如果不是,我怎么能做这样的事情呢?

注意:我使用的是 IAR 8.20.2

(this link https://stackoverflow.com/questions/39317816/use-of-in-a-macro没有帮助)

我你想知道为什么我不想使用两个不同的宏是因为我需要这样的东西(伪代码):

myFunction(int or array):
   doSomethingWhereIntAndArrayBehavesDifferentlyLikePrintf();
   doSomethingelse();
   doSomethingelse();
   doSomethingWhereIntAndArrayBehavesDifferentlyLikePrintf();
   doSomethingelse();
  • 它非常方便:您可以分解代码。
  • 这是一种实现多态性的方法。
  • 它模仿 C++ 模板功能。

有没有办法在宏中调用#if 语句?

不可能。

如果不是,我怎么能做这样的事情呢?

您可以使用 C11 _Generic:

#include <stdio.h>

void int_func (int obj)
{
  printf("%d\n", obj);
}

void int_arr_func (const int* obj)
{
  printf("%d\n", obj[0]);
}

void float_func (float obj)
{
  printf("%f\n", obj);
}

#define MY_MACRO2(y) _Generic((y), \
  int:   int_func,                 \
  int*:  int_arr_func,             \
  float: float_func ) (y)


int main (void)
{
    int a = 38;
    int b[]={42};
    float pi = 3.14f;

    MY_MACRO2(a);
    MY_MACRO2(b);
    MY_MACRO2(pi);
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何避免在多态打印宏中使用 #if 的相关文章

随机推荐