3

需要帮助解决错误:预期标识符或 '(' 在 '{' 标记之前。我有一个主文件和一个排序堆文件。这三个文件都是独立的,我正在尝试在终端上运行这些文件。命令行我用来在终端上运行这个文件是:

gcc -std=c99 -DRAND -DHEAP -DTYPE=double -DPRINT main.c srtheap.c

这是我的代码:

/*
 *
 *  srt.h file
 *
 */

#ifndef SRT_H  
#define SRT_H  
#include < string.h >  
#define MAX_BUF 256

#define swap(qx,qy,sz) 

{                                             
  do                                                                 
   char buf[MAX_BUF];                                              
   char *q1 = qx;                                                  
   char *q2 = qy;                                                  
   for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) {    
       m = ms < sizeof(buf) ? ms : sizeof(buf);                    
       memcpy(buf, q1, m);                                         
       memcpy(q1, q2, m);                                          
       memcpy(q2, buf, m);                                         

  while (0)
}

void srtbubb(void *, size_t, size_t, int (*)(const void *, const void *));  
void srtheap(void *, size_t, size_t, int (*)(const void *, const void *));  
void srtinsr(void *, size_t, size_t, int (*)(const void *, const void *));  
void srtmerg(void *, size_t, size_t, int (*)(const void *, const void *));  

#endif /* SRT_H */
4

4 回答 4

6

多行宏的A#define要求您以 . 结束每一行(最后一行除外)\。所以你会得到:

#define swap(qx,qy,sz)                                              \
do {                                                                \
    char buf[MAX_BUF];                                              \
    char *q1 = qx;                                                  \
    char *q2 = qy;                                                  \
    for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) {    \
        m = ms < sizeof(buf) ? ms : sizeof(buf);                    \
        memcpy(buf, q1, m);                                         \
        memcpy(q1, q2, m);                                          \
        memcpy(q2, buf, m);                                         \
    }                                                               \
} while (0)

非常小心不要在之后有任何空格,\因为这会取消\并破坏多行#define,这将导致难以找到编译器错误。

于 2013-06-27T14:40:56.050 回答
6

您的 do-while 循环在大括号方面有错误的语法(do-while 需要一对,for 循环需要一对。此外,您在 . 之后缺少分号while。并且您需要\for 多行宏。试试这个:

#define swap(qx,qy,sz)                                              \
do                                                                  \
{                                                                   \ 
   char buf[MAX_BUF];                                               \
   char *q1 = qx;                                                   \ 
   char *q2 = qy;                                                   \ 
   for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) {     \
       m = ms < sizeof(buf) ? ms : sizeof(buf);                     \
       memcpy(buf, q1, m);                                          \
       memcpy(q1, q2, m);                                           \
       memcpy(q2, buf, m);                                          \
   }                                                                \
} while (0)
于 2013-06-27T14:39:03.370 回答
1

您正在尝试#define使用多行宏,这可能是也可能不是您想要的。在任何情况下,您都需要在\每行的末尾添加续行符(并修复括号):

#define swap(qx,qy,sz)   \
  do {                   \
   char buf[MAX_BUF];    \
   char *q1 = qx;        \
   char *q2 = qy;        \
   for (size_t m, ms = sz; ms > 0; ms -= m, q1 += m, q2 += m) {    \
       m = ms < sizeof(buf) ? ms : sizeof(buf);                    \
       memcpy(buf, q1, m);                                         \
       memcpy(q1, q2, m);                                          \
       memcpy(q2, buf, m);                                         \
       }                                                           \
   }                     \
while (0)
于 2013-06-27T14:44:10.327 回答
1

#defineing中有几个错误/错别字swap()

这应该这样做(至少编译):

#define swap(qx,qy,sz) \
  do { \ 
    char buf[MAX_BUF]; \
    char *q1 = (qx); \
    char *q2 = (qy); \
    for (size_t m, ms = (sz); ms > 0; ms -= m, q1 += m, q2 += m) \
    { \
      m = ms < sizeof(buf) ? ms : sizeof(buf); \
      memcpy(buf, q1, m); \
      memcpy(q1, q2, m); \
      memcpy(q2, buf, m); \
    } \
  } while (0) 

请注意,定义可能没有换行符,因此\用于告诉预处理器加入行。

此外,建议在使用宏时将其参数放入()其中,以避免宏扩展后产生不必要的副作用。

于 2013-06-27T14:44:46.507 回答