You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译报错:expected primary-expression before '.' token 问题求助

解决m3vcftools编译时的C++结构体初始化错误

嘿,我来帮你搞定这个编译问题!你遇到的expected primary-expression before '.' token错误,根源是代码里用了C99标准的结构体指定初始化语法(就是.func = xxx这种写法),但你的编译器在编译C代码时不支持这种语法——C直到C20才正式引入这个特性,很多老版本的GCC/Clang在编译C代码时默认不会启用它。

下面给你几个不用慌的解决方案,按优先级推荐:

方案1:把Main.cpp当成C文件编译(最稳妥,不用改业务代码)

这段代码本质是C风格的,只要告诉CMake用C编译器来编译Main.cpp就能解决问题:

  1. 找到项目根目录下的CMakeLists.txt文件
  2. 在编译Main.cpp的规则前,添加一行设置:
    set_source_files_properties(src/Main.cpp PROPERTIES LANGUAGE C)
    
  3. 比如原来的编译命令是add_executable(m3vcftools src/Main.cpp ...),现在把上面那行加在它前面就行
  4. 重新运行cmake ..(如果之前已经运行过,最好先删掉build目录再重新cmake),然后执行make

方案2:让编译器启用C++20标准

如果一定要用C编译,那就让编译器支持C20标准,因为C++20已经兼容这种初始化写法:

  1. 打开CMakeLists.txt,添加这两行配置:
    set(CMAKE_CXX_STANDARD 20)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    
  2. 同样重新cmake再编译。注意:你的编译器版本得够新——GCC 8以上、Clang 10以上才能完全支持C++20的这个特性。

方案3:临时修改代码(其实非常安全,完全不影响功能)

如果你实在不敢改代码,但上面两种方法都走不通,其实这个修改超简单,只是换一种初始化写法而已:
把你贴出来的cmds数组改成按结构体成员顺序赋值的形式(结构体cmd_t的成员顺序是func、alias、help):

static cmd_t cmds[] = {
    { NULL, "M3VCF manipulation", NULL },
    { main_m3vcfcompress, "compress", "compress VCF file to M3VCF" },
    { main_m3vcfconcat, "concat", "concatenate M3VCF files from the same set of samples" },
    { main_m3vcfconvert, "convert", "convert M3VCF files to different formats and back" },
    { NULL, NULL, NULL }
};

这种写法是C++所有版本都支持的,和原来的指定初始化效果完全一样,只是少了成员名标记而已。

内容的提问来源于stack exchange,提问作者Jared

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:28:13