我已复制项目props-3.3.9
:readproc.c
文件
然后使用 gcc 编译成功,执行访问。
但现在我想用c ++编写代码,但g ++编译错误!
g ++报告错误:
expression of type 'void' is illegal
#define F(x) {#x, sizeof(#x)-1, (long)(&&case_##x-&&base)},
^
readproc.c:122:9:in expansion of macro ‘F’
F(VmHWM)
^
这里是代码:
#define LABEL_OFFSET
typedef struct status_table_struct {
unsigned char name[7]; // /proc/*/status field name
unsigned char len; // name length
#ifdef LABEL_OFFSET
long offset; // jump address offset
#else
void *addr;
#endif
} status_table_struct;
#ifdef LABEL_OFFSET
#define F(x) {#x, sizeof(#x)-1, (long)(&&case_##x-&&base)},
#else
#define F(x) {#x, sizeof(#x)-1, &&case_##x},
#endif
#define NUL {"", 0, 0},
static const status_table_struct table[] = {
F(VmHWM)
NUL NUL
F(VmLck)
NUL
F(VmSwap)
F(VmRSS)
NUL
F(VmStk)
NUL
F(Tgid)
F(State)
};
#undef F
#undef NUL
base:
case_Name:
case_ShdPnd:
case_SigBlk:
case_SigCgt:
case_SigIgn:
case_SigPnd:
case_State:
语法有什么问题?
答案 0 :(得分:1)
使用g ++ 5.4.0,我能够通过以下方式编译readproc.c
(https://gitlab.com/procps-ng/procps/blob/v3.3.9/proc/readproc.c):
用restrict
__替换__restrict
(所有39次出现)。
虽然restrict
是C中的有效关键字(随C99引入),但C ++标准并未对其进行定义。 GCC和clang确实支持__restrict__
关键字作为扩展。
有关restrict
的详细信息,请参阅http://en.cppreference.com/w/c/language/restrict。
-fpermissive
添加到编译命令行。这会放松一些编译器错误(例如无效指针强制转换)并将其转换为警告。请务必查看生成的警告,以免忽略实际错误。由于上面粘贴的代码来自该文件,我认为它也应该编译(虽然我没有看到你报告的错误)。