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 代码执行此操作。但现在已经不是这样了。
编译开源时出现奇怪的错误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 代码执行此操作。但现在已经不是这样了。