获取错误:预期标识符或'(''''''之前的标记

时间:2013-06-27 14:36:19

标签: c

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

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 个答案:

答案 0 :(得分:6)

你的do-while循环有关于大括号的错误语法(需要一对do-while,一对for for循环。另外,你在while之后缺少分号。你需要多行宏的\。试试这个:

#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)

答案 1 :(得分:6)

多行宏的#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,这将导致很难找到编译器错误。

答案 2 :(得分: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)

答案 3 :(得分:1)

#define 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) 

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

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