"ошибка: ожидаемый идентификатор или '(' перед числовой константой" -? - PullRequest
2 голосов
/ 12 ноября 2010

Ошибка в заголовке возникает в строке '#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

Ответы [ 3 ]

11 голосов
/ 12 ноября 2010

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

//                  v Make this the last character on the line
#define NOT()       \
  ( NOT_OP << 28 ) 
6 голосов
/ 12 ноября 2010

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

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

#define NOT()
  ( NOT_OP << 28 )

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

#define NOT() ( NOT_OP << 28 )

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

#define NOT() \
  ( NOT_OP << 28 )
2 голосов
/ 12 ноября 2010

Хммм ... Полагаю, вы не помещаете подстановку для #define в другую строку, верно?

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

должно быть

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

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

...