使用‘-Wcast qual’;选项来检查编译
我正在读的书中写道: “-Wcast-qual”此选项警告要删除的强制转换指针 类型限定符,如const。例如,以下函数 从输入参数中丢弃常量限定符,允许它 被覆盖:使用‘-Wcast qual’;选项来检查编译,c,gcc,C,Gcc,我正在读的书中写道: “-Wcast-qual”此选项警告要删除的强制转换指针 类型限定符,如const。例如,以下函数 从输入参数中丢弃常量限定符,允许它 被覆盖: void f (const char * str) { char * s = (char *)str; s[0] = ’\0’; } 修改str的原始内容违反了其法律规定 常量属性。此选项将警告不正确的强制转换 允许修改字符串的变量str 我试图重复这一点,希望得
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免费软件基金会,这是免费软件;查看复制条件的来源。没有保证;甚至不是为了某一特定目的的适销性或适合性。