l**n 发帖数: 44 | 1 static void foo_execvp(const char* cmd, char const* const* argv)
{
...
#if defined(_MSC_VER)
_execvp(cmd, argv);
#elif defined(__MINGW32__)
execvp(cmd, argv);
#else
execvp(cmd, (char* const*)argv); //warning: cast discards qualifiers
from pointer target type
#endif
}
从我的测试来看,似乎只有在linux64 下才会出现这个警告信息,为什么?
如何消除这个warning?
多谢! | X****r 发帖数: 3557 | 2 因为你将一个char const* const*强制转换为char * const*,把char上面的
const去掉了,自然有这个警告。
除去警告最正确方法是把argv指向的内容深度复制一遍后传给execvp。
qualifiers
【在 l**n 的大作中提到】 : static void foo_execvp(const char* cmd, char const* const* argv) : { : ... : #if defined(_MSC_VER) : _execvp(cmd, argv); : #elif defined(__MINGW32__) : execvp(cmd, argv); : #else : execvp(cmd, (char* const*)argv); //warning: cast discards qualifiers : from pointer target type
| l**n 发帖数: 44 | 3 According to your reply, I modified the code:
...
#else
char* const* dp_argv = (char**)malloc(strlen(*argv)+1);
strcpy(*dp_argv,*argv);
execvp(cmd, dp_argv);
#endif
It works well. Thanks!
【在 X****r 的大作中提到】 : 因为你将一个char const* const*强制转换为char * const*,把char上面的 : const去掉了,自然有这个警告。 : 除去警告最正确方法是把argv指向的内容深度复制一遍后传给execvp。 : : qualifiers
| l**n 发帖数: 44 | 4 should free the deep copy
++ free(*dp_argv);
【在 l**n 的大作中提到】 : According to your reply, I modified the code: : ... : #else : char* const* dp_argv = (char**)malloc(strlen(*argv)+1); : strcpy(*dp_argv,*argv); : execvp(cmd, dp_argv); : #endif : It works well. Thanks!
| X****r 发帖数: 3557 | 5 argv是个数组啊,你要把它们都复制一遍才对。
【在 l**n 的大作中提到】 : According to your reply, I modified the code: : ... : #else : char* const* dp_argv = (char**)malloc(strlen(*argv)+1); : strcpy(*dp_argv,*argv); : execvp(cmd, dp_argv); : #endif : It works well. Thanks!
|
|