让我们尝试运行以下代码:
#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++ 模板功能。