2016-05-01 11 views
-2

Ich versuche, eine Reihe von Makros für eine Bibliothek zu erstellen, um digitale I/O auf einem eingebetteten Prozessor (GNU-Compiler) für neue Benutzer einfacher zu machen. Hier ist, was ich bisher habe:C-Makro-Erweiterung

[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] 

OUTPUT (LED3) sollte ergeben: (TRISA4) = 0; HIGH (LED3) sollte ergeben: (RA4) = 1;

aber was ich bekommen ist:

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

Kann mir jemand sagen, was ich falsch mache?

+0

Ich habe eine Ahnung, dass Makros, die mit einer Nummer beginnen, eine schlechte Idee sind - oder nicht gültig. –

+0

Niemals solche Definitionen verwenden: #define 1 A4 –

Antwort

1

Ermöglicht es durch den Compiler laufen und sehen, was es sagt:

$ 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; 

Das ziemlich klar, mir scheint ...

0

In C (wie auch in C++), Makronamen sind benötigt, um die Regeln für die Bezeichner – zu folgen und diese sind erforderlich, um mit einem alphabetischen Zeichen (Groß- oder Kleinschreibung spielt keine Rolle) oder einem Unterstrich zu beginnen.

Auch wenn es erlaubt wäre, würde Ihr Makro extrem gefährlich sein, da jede einzelne stehende Nummer 1 (eins) würde durch das Makro ersetzt werden, wie hier:

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

Zusätzlich dieser Name nicht sehr informativ. '1' könnte alles bedeuten, einen Anfangsindex in ein Array (wenn Indizes zuvor für irgendeinen anderen Zweck reserviert sind), LPT1, ... Geben Sie Ihren Makros richtige, informative Namen, damit jeder, der sie irgendwo in Ihrem Code liest, einen Hinweis bekommt sie stehen tatsächlich (dies gilt für alle Bezeichner: Variablen, Funktionen, Makros, ...). In Ihrem Fall etwas wie IO1, DIGITAL_IO_1, DIO1, ... (für das Indexbeispiel oben: man könnte es FIRST_OF_<some_functional_description> oder START_<description> nennen).