编译报错: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就能解决问题:
- 找到项目根目录下的
CMakeLists.txt文件 - 在编译Main.cpp的规则前,添加一行设置:
set_source_files_properties(src/Main.cpp PROPERTIES LANGUAGE C) - 比如原来的编译命令是
add_executable(m3vcftools src/Main.cpp ...),现在把上面那行加在它前面就行 - 重新运行
cmake ..(如果之前已经运行过,最好先删掉build目录再重新cmake),然后执行make
方案2:让编译器启用C++20标准
如果一定要用C编译,那就让编译器支持C20标准,因为C++20已经兼容这种初始化写法:
- 打开
CMakeLists.txt,添加这两行配置:set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) - 同样重新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
相关产品推荐
相关产品推荐

