extern "C" 'initializing': 无法从 'const char [1]' 转换为 'char *'

extern "C" 'initializing': cannot convert from 'const char [1]' to 'char *'

编译开源时出现奇怪的错误lib

我使用 visual studio 2019 我为 lib cmake -G "Visual Studio 16 2019" ../" 创建了一个解决方案 但我在编译时不断出错:

从这一行开始:

    CFUNC char  *optarg = "";   
C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(16,24): error C2440: 'initializing': cannot convert from 'const char [1]' to 'char *'
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(16,20): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings)
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(30,27): error C2440: 'initializing': cannot convert from 'const char [1]' to 'char *'
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(30,21): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings)
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(38,16): error C2440: '=': cannot convert from 'const char [1]' to 'char *'
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(38,12): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings)
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(45,16): error C2440: '=': cannot convert from 'const char [1]' to 'char *'
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(45,12): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings)
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(51,16): error C2440: '=': cannot convert from 'const char [1]' to 'char *'
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(51,12): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings)
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(85,16): error C2440: '=': cannot convert from 'const char [1]' to 'char *'
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(85,12): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings)
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(94,15): error C2440: '=': cannot convert from 'const char [1]' to 'char *'
1>C:\Dev\my\cpp\libs\libunistd-master\unistd\getopt.cpp(94,11): message : Conversion from string literal loses const qualifier (see /Zc:strictStrings)

"" 是一个 常量 字符串。您不能只将其分配给非常量 char *,因为那样它可能会通过指针发生变异。

根据 the source code of libunistd, the implementation was taken from NetBSD, but a quick check¹ shows NetBSD 根本没有初始化 optarg

char    *optarg;        /* argument associated with option */

您可以采用相同的方法。

您也可以通过将 /Zc:strictStrings-(注意连字符)传递给您的编译器来关闭此错误。只要不写入常量字符串,应该没什么坏处。

您可能想 report this as a bug 给库作者。


¹ 不确定我看到的是最新版本。这是 2014 年的事。

这并不奇怪。 ""(或任何字符串文字)的类型是 const char[]optarg 的类型是 char*。因此,如果允许分配,您将能够通过指针 optarg 修改字符串文字。显然这是不可取的。

在旧版本的 C++ 中,此赋值作为一种特殊情况被允许,只是因为有太多旧的 C 代码执行此操作。但现在已经不是这样了。