需要有关错误的帮助:期望的标识符或'(''''''之前的标记。我有一个主文件和一个排序堆文件。这三个文件都是独立的,我试图在终端上运行这些文件。我用来在终端上运行这个文件的命令行是:
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 */
答案 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)
请注意,定义可能没有换行符,因此\
用于告诉预处理器加入行。
同样建议在使用时将宏的参数放在()
中,以避免在宏扩展后产生不必要的副作用。