C macro expansion



我正在尝试为库创建一组宏,以使嵌入式处理器(GNU编译器(上的数字I/O对新用户来说更简单。 这是我到目前为止所拥有的:

[code]
    #define 1 A4            // this is so that I can refer to I/O 
    #define 2 B5            // by reference number 1-55
    // ****************************************************
    // I/O #defines
    // ****************************************************
    #define OUTPUT(pin) JOIN(TRIS, pin) = 0
    #define JOIN(a, b) (a ## b)
    #define HIGH(pin) JOIN(R,pin) = 1
    #define SWITCH3     1
    #define LED3        2
    OUTPUT(LED3);
    HIGH(LED3);
[/code]

输出(LED3( 应导致: (TRISA4( = 0;高(LED3( 应导致: (RA4( = 1;

但我得到的是:

(TRIS1( = 0;(R1( = 1;

谁能告诉我我做错了什么?

让我们通过编译器运行它,看看它说了什么:

$ gcc -E code.c
# 1 "code.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "code.c"
code.c:1:9: error: macro names must be identifiers
 #define 1 A4            // this is so that I can refer to I/O 
         ^
code.c:2:9: error: macro names must be identifiers
 #define 2 B5            // by reference number 1-55
         ^
# 14 "code.c"
(TRIS2) = 0;
(R2) = 1;

这对我来说似乎很清楚...

在 C(以及 C++(中,宏名称需要遵循标识符规则 - 这些规则必须以字母字符(大写或小写无关紧要(或下划线开头。

即使允许,您的宏也将非常危险,因为任何单个站立的数字 1(一(都会被宏替换,如下所示:

for(int i = 1; i < n + 1; ++i)

此外,这个名字的信息量不是很大。"1"可以表示任何东西,数组的初始索引(如果之前的索引保留用于任何其他目的(,LPT1,...给你的宏提供适当的、信息丰富的名称,这样任何在代码中阅读它们的人都会得到一个提示,它们实际上代表什么(这适用于所有标识符:变量、函数、宏......在您的情况下,例如 IO1DIGITAL_IO_1DIO1 、...(对于上面的索引示例:可以称之为FIRST_OF_<some_functional_description>START_<description>(。

最新更新