2010-11-11 2 views
2

Ошибка в заголовке происходит в строке '#define' для каждого макроса, подобного функции, в этом заголовочном файле (начиная с строки 45). ? делать что-то неправильно"ошибка: ожидаемый идентификатор или '(' перед числовой константой" -?

#ifndef ASSEMBLER_H 
#define ASSEMBLER_H 


/* Ports */ 
#define Input 0 
#define Output 15 

/* Registers */ 
#define Z 0 
#define A 1 
#define B 2 
#define C 3 
#define D 4 
#define E 5 
#define F 6 
#define G 7 

/* OP Codes */ 
    /*-----Control--------*/ 
#define HLT_OP 0 
#define JMP_OP 1 
#define CJMP_OP 2 
#define OJMP_OP 3 
    /*-----Load/Store-----*/ 
#define LOAD_OP 4 
#define STORE_OP 5 
#define LOADI_OP 6 
#define NOP_OP 7 
    /*-----Math-----------*/ 
#define ADD_OP 8 
#define SUB_OP 9 
    /*-----Device I/O-----*/ 
#define IN_OP  10 
#define OUT_OP 11 
    /*-----Comparison-----*/ 
#define EQU_OP 12 
#define LT_OP  13 
#define LTE_OP 14 
#define NOT_OP 15 

/* Macros */ 
    /*-----Control--------*/ 
#define HLT() 
    (HLT_OP << 28) 
#define JMP(address) 
    ((JMP_OP << 28) | (address)) 
#define CJMP(address) 
    ((CJMP_OP << 28) | (address)) 
#define OJMP(address) 
    ((OJMP_OP << 28) | (address)) 
    /*-----Load/Store-----*/ 
#define LOAD(dest, value) 
    ((LOAD_OP << 28) | ((dest) << 24) | (value)) 
#define STORE(dest, value) 
    ((STORE_OP << 28) | ((dest) << 24) | (value)) 
#define LOADI(dest, value) 
    ((LOADI_OP << 28) | ((dest) << 24) | (value)) 
#define NOP() 
    (NOP_OP << 28) 
    /*-----Math-----------*/ 
#define ADD(dest, op1, op2) 
    ((ADD_OP << 28) | ((dest) << 24) | ((op1) << 20) | ((op2) << 16)) 
#define SUB(dest, op1, op2) 
    ((SUB_OP << 28) | ((dest) << 24) | ((op1) << 20) | ((op2) << 16)) 
    /*-----Device I/O-----*/ 
#define IN(reg) 
    ((IN_OP << 28) | ((reg) << 24) | (Input)) 
#define OUT(reg) 
    ((OUT_OP << 28) | ((reg) << 24) | (Output)) 
    /*-----Comparison-----*/ 
#define EQU(reg1, reg2) 
    ((EQU_OP << 28) | ((reg1) << 24) | ((reg2) << 20)) 
# define LT(reg1, reg2) 
    ((LT_OP << 28) | ((reg1) << 24) | ((reg2) << 20)) 
#define LTE(reg1, reg2) 
    ((LTE_OP << 28) | ((reg1) << 24) | ((reg2) << 20)) 
#define NOT() 
    (NOT_OP << 28) 



#endif 

ответ

11

директиву препроцессора (как #define) завершается символом новой строки, так что это может быть только одна строка длиной Если вы хотите макроопределения многострочный, вам нужно, чтобы избежать новой строки.:

//     v Make this the last character on the line 
#define NOT()  \ 
    (NOT_OP << 28) 
+0

О, да. Благодарю. –

6

Макрос должен быть написан на 1 строке , А не 2.

Это неправильно:

#define NOT() 
    (NOT_OP << 28) 

Это право:

#define NOT() (NOT_OP << 28) 

Если вы действительно хотите, чтобы записать его на нескольких строках, используйте обратную косую черту для «побега» новый линия. как это:

#define NOT() \ 
    (NOT_OP << 28) 
2

Хммм ... Я думаю, вы не положить подстановки для #define в другой линии, не так ли?

#define JMP(address) 
((JMP_OP << 28) | (address)) 

должно быть

#define JMP(address) ((JMP_OP << 28) | (address)) 

вместо того, чтобы, например. #define декларации должны быть в одной строке или использовать \ в конце строки, чтобы перейти к следующей.