我搜索并发现了一些其他类似的问题。但我在我的代码中找不到失败的地方。 也许有人找到了? 这是/曾经是 C 代码。但我必须在 .cpp 中重命名它,所以我没有任何错误:
make[1]: Entering directory `/home/numa'
c++ -DHAVE_CONFIG_H -I. -I/usr/include/libxml2 -g -O2 -MT numabench.o -MD -MP -MF .deps/numabench.Tpo -c -o numabench.o numabench.cpp
numabench.cpp: In function ‘int main(int, char**)’:
numabench.cpp:176:29: error: expected primary-expression before ‘)’ token
numabench.cpp:176:31: error: expected ‘,’ or ‘;’ before ‘{’ token
numabench.cpp:192:1: error: expected ‘}’ at end of input
这是 numabench.cpp 的方法
还缺什么。有人有想法吗?
int main(int argc, char** argv)
{
setup_t* setup = (setup_t){
.regions = (memory_regions_t){ .count = 0, .regions = NULL }
};
assert(argc == 2);
parse_setup_file(&setup, argv[1]);
printf("<?xml version='1.0'?>\n\n");
printf("<numabench-result>\n\n");
iterate_params(&setup, 0);
printf("</numabench-result>\n");
mainPCM();
return EXIT_SUCCESS;
}
最佳答案
您的代码使用了 C++ 无法识别的两个 C 功能:复合文字,允许您在初始化和指定初始化器之外指定复合数据结构(数组和结构)的值 允许您初始化结构的各个字段或各个数组条目。
我假设 setup_t
是结构的 typedef。您的代码:
setup_t* setup = (setup_t){
.regions = (memory_regions_t){ .count = 0, .regions = NULL }
};
不能在 C 中编译。编译器需要其中一个
setup_t *setup = (setup_t[]) {{ .regions = ... }};
或
setup_t *setup = &(setup_t) { .regions = ... };
否则,初始化时会出现不兼容的类型,即 setup_t *
和 setup_t
。
您可以通过指定 setup_t
实例并使 setup
成为指向该实例的指针来绕过复合文字:
setup_t data = { .regions = ... };
setup_t *setup = &data;
您可以通过按 C89 中的顺序指定字段或创建一个初始化为全零的实例,然后为要初始化的字段分配值来绕过指定的初始化程序。
在您的情况下,所有初始化值均为零。初始化至少一个字段可确保所有后续字段也初始化为零或空值。您可以尝试:
setup_t data = {0};
setup_t *setup = &data;
或者,setup_t
的第一个字段是一个结构体,例如regions
:
setup_t data = {{0}};
setup_t *setup = &data;
我已经用一个(虚构的)结构尝试过这个,它似乎可以在 C++ 中工作。
关于c++ - ‘)’ 标记之前预期有主表达式吗?错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27826873/