C嵌套宏

C嵌套宏,c,avr,avr-gcc,avrdude,C,Avr,Avr Gcc,Avrdude,我想到了一个问题。有人可能会告诉我如何删除@ 我为加州大学写C,我很懒;所以我想解决宏的简单问题,例如打开LED 我设法做到了这样: #include <stdio.h> #define BIT_STD_SET(PORT, BITNUM) ((PORT) |= (1<<(BITNUM))) #define BIT_STD_CLE(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM))) #define BIT_STD_TOG(

我想到了一个问题。有人可能会告诉我如何删除
@

我为加州大学写C,我很懒;所以我想解决宏的简单问题,例如打开LED

我设法做到了这样:

#include <stdio.h>

#define BIT_STD_SET(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
#define BIT_STD_CLE(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))
#define BIT_STD_TOG(PORT, BITNUM) ((PORT) ^= (1<<(BITNUM)))

#define LEDPORT_0 C
#define LEDPAD_0 3 /*Blau*/

#define LEDPORT_1 D
#define LEDPAD_1 4 /*GelbWeis*/

#define PO(n) LEDPORT_##n
#define POR(n) PORT@PO(n)

#define PA(n) LEDPAD_##n
#define PAD(n) PA(n)

#define LEDAN(n) BIT_STD_SET(POR(n),PAD(n))


#define f(a,b) a##b
#define g(a) #a
#define h(a) g(a)

int main()
{
  printf("%s\n",h(LEDAN(0)));
  printf("%s\n",h(LEDAN(1)));
  printf("\n");
  printf("%s\n",h(LEDAN(1)));
  printf("\n");
  printf("%s\n",h(POR(0)));
  printf("%s\n",h(POR(1)));
  printf("%s\n",h(f(0,1)));
  printf("%s\n",g(f(0,1)));
  return 0;
}
得到:

p@d:~/$ ./a.out 
答复:

((PORT@C) |= (1<<(3)))
((PORT@D) |= (1<<(4)))

((PORT@D) |= (1<<(4)))

PORT@C
PORT@D
01
f(0,1)

((PORT@C)|=(1如果您不想打印@,请将其替换为:

#define POR(n) PORT@PO(n)
为此:

#define POR(n) PORT PO(n)

希望我能帮上忙。

您可以将代币与以下内容连接起来:

#define CATx(a,b)  a##b
#define CAT(a,b)   CATx(a,b)

然后您可以像
#define POR(n)CAT(PORT,PO(n))一样使用它

解决此类问题的正确工具是使用调试器,但不要在调试器之前询问堆栈溢出。请告诉我们您在检查代码时所做的所有观察,并将代码逐行逐行排在第一位。此外,您可能希望阅读至少给我们留下一个重现您的问题的注释。(这是πάντα提供的个人股票评论。)ῥεῖ™)阅读文档:mark+ctrlK为您完成任务,无需磨损空格键。请澄清。您需要从何处删除
@
?为了让您的代码读者(包括您自己几个月后)更清楚地了解,请写出您希望代码执行的操作,不要试图将实际代码隐藏在一堆宏后面
#define CATx(a,b)  a##b
#define CAT(a,b)   CATx(a,b)