c++ - ‘)’ 标记之前预期有主表达式吗?错误

标签 c++ c

我搜索并发现了一些其他类似的问题。但我在我的代码中找不到失败的地方。 也许有人找到了? 这是/曾经是 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/

相关文章:

c++ - 是否需要将 delete 用于在 vector 中创建的新数组?

c++ - pimpl 习语和模板类 friend

执行简单的opengl教程时出现c++段错误

c - 如何通知服务器客户端正在关闭连接

c - 为什么unsigned char变量包含EOF?

c++ - 在屏幕上输出矩形?

c++ - 编译时数组常量

c - while 在这种特殊情况下如何工作?

c - 在C中使用fprintf时出现STATUS_ACCESS_VIOLATION(通过弹出框授予管理员权限)

c - 为 FSMC LCD 编写非阻塞代码