【发布时间】:2010-11-19 12:15:32
【问题描述】:
我最近做了一个 cp 克隆(用于大学),我碰巧发现了一些我从未有机会接触到的东西。
这至少适用于 GCC 编译 C 源代码。
我在 Mac OS X (10.6.4) 中完成了这个特定 C 程序的主要开发,使用 Apple 的 /usr/bin/gcc --version 构建
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5664)
Copyright (C) 2007 Free Software Foundation, Inc.
但是,我在 Mac 中的 Arch Linux 虚拟机中运行测试,使用最新的 gcc(没有添加、没有自定义、没有像 Apple 那样的模组)
gcc (GCC) 4.5.1
Copyright (C) 2010 Free Software Foundation, Inc.
我们必须在 Ubuntu 10.04.1 LTS 的类中构建它。
我的 Makefile 是这样的:
CC=gcc
#CFLAGS=-O0 -g -Wall
CFLAGS=-O3 -Wall -finline-functions
EXE=copy
compile:
$(CC) $(CFLAGS) -o $(EXE) main.c
所以,我总是在启用-Wall 的情况下运行(在每个操作系统中)gcc。
Mac 和 Arch 从未显示任何警告。
Ubuntu 打印了两个警告,有 和没有 -Wall
do_copy.c: In function 'do_copy_file2file':
do_copy.c:27: warning: ignoring return value of 'realpath', declared with attribute warn_unused_result
do_copy.c: In function 'do_copy_symlink2file':
do_copy.c:117: warning: ignoring return value of 'symlink', declared with attribute warn_unused_result
Ubuntu 的 GCC 版本是发行版的默认版本:
gcc (Ubuntu 4.4.3-ubuntu5) 4.4.3
为什么会这样?
为什么我在其他两个操作系统中没有看到任何警告,而在 Ubuntu 中却看到了?
【问题讨论】:
-
警告信息中有线索。
-
@Paul:OP 不是询问警告的含义,而是询问为什么它们出现在一个特定的环境中。这些警告非常偏执,通常不会出现,即使是
-Wall。 -
@Marcelo:是的,正如我所说,从警告消息中很容易看出原因 - /usr/include/stdlib.h 和 /usr/include/unistd 中的 realpath 和 symlink 声明.h 在较新的发行版中具有 warn_unused_result 属性。
-
@Paul “较新的发行版”是否仅意味着 Ubuntu?因为 Arch 有一个更新的 gcc 实现。却什么也没说。
-
@ssice:我不知道 - 我原以为大多数当前的发行版现在都有这个 - 看看 /usr/include 中的一些标题。
标签: macos gcc ubuntu archlinux