0

我正在尝试完成“计算机科学基础,C 版”中的练习。下面的代码直接来自本书,但是当我尝试按照它们的描述包含和使用它时,我得到了编译器错误。

#define DefCell(EltType, CellType, ListType)
typedef struct CellType *ListType;
struct CellType {
    EltType element;
    ListType next;
};

/*************************************************
 *  DefCell(int, CELL, LIST);
 *
 *  expands to:
 *
 *  typedef struct CELL *LIST;
 *  struct CELL {
 *      int element;
 *      LIST next;
 *  }
 *
 *  as a consequence we can use CELL as the type of integer cells
 *  and we can use LISTas the type of pointers to these cells.
 *
 *  CELL c;
 *  LIST l;
 *
 * defines c to be a cell and l to be a pointer to a cell.
 * Note that the representation of a list of cells is normally
 * a pointer to the first cell on the list, or NULL if the list
 * is empty.
 *
 ****************************************************/ 

(这本书可以免费下载 - 此代码在第 23 页。)

我也尝试使用模板来解决其中一个练习(2.2.3):

DefCell(char, LETTER, STRING);

BOOLEAN FirstString(STRING s1, STRING s2);

我得到的错误是:

selectionsort.c:22:2: error: expected specifier-qualifier-list before ‘EltType’
selectionsort.c:60:28: error: expected ‘)’ before ‘s1’
selectionsort.c:133:28: error: expected ‘)’ before ‘s1’

我知道编译器不知道 STRING 或 EltType 是一种类型,但我不明白为什么不知道呢?这本书有点老了,所以 C 编程可能已经从书中的技术转移了。也有可能我只是误解了他们提出的想法的一些关键要素。在继续之前,我真的很想了解我做错了什么。任何人都可以帮忙吗?

4

2 回答 2

1

宏和它下面的注释不匹配。

#define DefCell(EltType, CellType, ListType)

说预处理器应该只删除DefCell(...).

如果要在多行上定义宏,则需要\在每个中间行的末尾包含一个反斜杠

#define DefCell(EltType, CellType, ListType) \
    typedef struct CellType *ListType;       \
    struct CellType {                        \
        EltType element;                     \
        ListType next;                       \
    };
于 2013-10-24T16:23:38.660 回答
1

宏是“单行”。

新行结束宏。

需要告诉预处理器,编辑器中的换行符不应该被视为一个。这是通过以反斜杠 ( )结束\行来完成的。

所以这

#define DefCell(EltType, CellType, ListType)
typedef struct CellType *ListType;
struct CellType {
  EltType element;
  ListType next; 
};

应该

#define DefCell(EltType, CellType, ListType) \
typedef struct CellType * ListType; \
struct CellType { \
  EltType element; \
  ListType next; \
};

请注意,在“行终止”反斜杠之后不允许进行这项工作。


顺便说一句:DefCell 不是可变参数宏。

#define DefCell(E, C, L, ...) 

将是一个。

于 2013-10-24T16:23:48.217 回答