我正在阅读an introduction to gcc,其中说:
' - Wcast-qual'这个选项会警告要删除的指针 一个类型限定符,例如const。例如,以下功能 从输入参数中丢弃const限定符,允许它 被覆盖:
void f (const char * str) { char * s = (char *)str; s[0] = ’\0’; }
修改str的原始内容是违反它的 const属性。这个选项会警告不正当演员 变量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';
}
命令是:gcc -Wcast-qual castqual.c
有人可以解释这种不一致吗?
答案 0 :(得分:1)
根据评论,事实证明OP正在使用mac,其中gcc
作为命令是clang
的包装器 - 基于llvm的编译器。
正在使用的clang版本接受该选项但不对其执行任何操作。正在添加对警告的支持,并且应该出现在XCode 7 / clang 7时间范围内;但问题是gcc
而不是clang
。
在这种情况下,您需要手动或使用包管理器(例如homebrew或macports)安装适当的gcc副本。一旦你安装了gcc,就可以使用它,例如gcc-4.8
,gcc-5
等(取决于包管理器)。如果要使用实际gcc编译代码,请使用:gcc-4.8 -Wcast-qual testcode.c
。如果你正在使用autoconf工具,你可以使用export CC=gcc-4.8; export CXX=g++-4.8
等,然后包将选择该编译器。
确认您正在呼叫gcc
而不是clang
,需要检查gcc --version
的输出。在clang包装器上,您会看到以下内容:
$ 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-4.8
的特定gcc
创建一个符号链接,并让它直接调用,但它可以破坏其他内容。