Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用‘-Wcast qual’;选项来检查编译_C_Gcc - Fatal编程技术网

使用‘-Wcast qual’;选项来检查编译

使用‘-Wcast qual’;选项来检查编译,c,gcc,C,Gcc,我正在读的书中写道: “-Wcast-qual”此选项警告要删除的强制转换指针 类型限定符,如const。例如,以下函数 从输入参数中丢弃常量限定符,允许它 被覆盖: void f (const char * str) { char * s = (char *)str; s[0] = ’\0’; } 修改str的原始内容违反了其法律规定 常量属性。此选项将警告不正确的强制转换 允许修改字符串的变量str 我试图重复这一点,希望得

我正在读的书中写道:

“-Wcast-qual”此选项警告要删除的强制转换指针 类型限定符,如const。例如,以下函数 从输入参数中丢弃常量限定符,允许它 被覆盖:

 void
       f (const char * str)
       {
         char * s = (char *)str;
         s[0] = ’\0’; }
修改str的原始内容违反了其法律规定 常量属性。此选项将警告不正确的强制转换 允许修改字符串的变量str

我试图重复这一点,希望得到警告,但编译时没有警告。我的代码如下:

#include <stdio.h>

void f(const char * str);

int main() {
    char Str = 'a';
    char * myStr;
    myStr = & Str;
    printf ("result: %c \n", * myStr);
    f(myStr);
    printf ("result: %c \n", * myStr);
    return 0;
}


void
f (const char * str)
{
  char * s = (char *)str;
  s[0] = '\0';
}
#包括
空f(常量字符*str);
int main(){
char Str='a';
char*myStr;
myStr=&Str;
printf(“结果:%c\n”,*myStr);
f(myStr);
printf(“结果:%c\n”,*myStr);
返回0;
}
无效的
f(常量字符*str)
{
char*s=(char*)str;
s[0]='\0';
}
命令是:
gcc-Wcast-qual-castqual.c


有人能解释这种不一致性吗?

根据评论,OP使用的是mac,其中,
gcc
作为命令是对基于llvm的编译器
clang
的包装

正在使用的clang版本接受该选项,但不使用该选项。正在添加对警告的支持,并应出现在XCode 7/clang 7时间段中;然而,问题是关于
gcc
,而不是
clang

在这种情况下,您需要手动或使用包管理器(如或)安装gcc的正确副本。一旦您安装了gcc,它将变得可用,例如,
gcc-4.8
gcc-5
,等等(取决于软件包管理器)。当您想用实际的gcc编译代码时,可以使用:
gcc-4.8-Wcast-qual-testcode.c
。如果您使用的是autoconf工具,则可以使用导出CC=gcc-4.8;导出CXX=g++-4.8,等等,然后该编译器将由包拾取

要验证调用的是
gcc
,而不是
clang
,需要检查
gcc--version
的输出。在叮当作响的包装上,您会看到如下情况:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 6.1.0 (clang-602.0.53) (based on LLVM 3.6.0svn)
Target: x86_64-apple-darwin14.4.0
Thread model: posix
而在实际的gcc实例上,您会看到:

$ gcc-5 --version
gcc-5 (Homebrew gcc 5.1.0) 5.1.0
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
imho旁白:您可以创建一个名为
gcc
的特定
gcc-4.8
的符号链接,并让它像那样直接调用,但它可以破坏其他东西


您是否碰巧使用了mac,而gcc实际上是clang的包装器?clang没有在当前发布的操作系统上报告这个问题(如果你有10.11版的开发人员测试版,它会报告错误)@Petesh很可能,在Linux上编译他的例子会产生
castqual.c:19:14:警告:cast丢弃指针目标类型[-Wcast-qual]的'const'限定符。
@Petesh我想这就是重点。那么你知道如何使用“真正的”gcc吗?谢谢!如果你想使用真正的gcc,你必须安装它。在我的mac上,我已经通过安装了真正的gcc,但你也可以使用macports(或其他)。安装后,您可以使用gcc版本(例如gcc-4.9、gcc-5-取决于您安装的内容)运行它,并且它应该显示相关的警告。@petesh-Ummm,这是有线的。我想我是用自制软件安装的。下面是我运行命令“gcc-4.8——版本”的结果:“lihangdeMacBook Pro:03 lihang$gcc-4.8——版本gcc-4.8(自制gcc48 4.8.4)4.8.4版权(C)2013免费软件基金会,这是免费软件;查看复制条件的来源。没有保证;甚至不是为了某一特定目的的适销性或适合性。