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

use*_*019 3 c

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

gcc -std=c99 -DRAND -DHEAP -DTYPE=double -DPRINT main.c srtheap.c
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

/*
 *
 *  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 */
Run Code Online (Sandbox Code Playgroud)

jh3*_*314 6

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

#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)
Run Code Online (Sandbox Code Playgroud)


mea*_*ers 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)
Run Code Online (Sandbox Code Playgroud)

要非常小心,之后没有任何空格,\因为这会取消\并打破多行#define,这将导致很难找到编译错误.

  • 通常,在定义宏时,如果用`do {...} while'包装,则在最后一行省略分号. (2认同)
  • @ meaning-matters你需要留在`do {...} while(0)`:http://stackoverflow.com/questions/154136/do-while-and-if-else-statements-in-cc -macros (2认同)