在glibc中找不到iso646.h

时间:2016-05-23 08:15:16

标签: c gcc glibc

我下载了glibc的几个版本,即2.18,2.19,2.20,2.23,我正在尝试查找文件iso646.h但找不到它。我认为它是glibc的标准部分所以它应该在那里。任何人都知道它为什么不存在?

但是,我在/ usr / lib / gcc目录中的本地机器上找到了它。所以我假设它是用gcc安装的。但我仍然不知道为什么我不能在glibc来源中找到它。我正在粘贴我在下面找到的内容:

/* Copyright (C) 1997-2014 Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
GNU General Public License for more details.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and 
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see 
<http://www.gnu.org/licenses/>.  */  

/*
 * ISO C Standard:  7.9  Alternative spellings  <iso646.h>
 */

#ifndef _ISO646_H
#define _ISO646_H

#ifndef __cplusplus
#define and     &&  
#define and_eq  &=
#define bitand  &
#define bitor   |
#define compl   ~
#define not     !
#define not_eq  !=
#define or      ||
#define or_eq   |=
#define xor     ^
#define xor_eq  ^=
#endif

#endif

编辑: 在我下载的每个glibc源代码(来自gnu.org)中找到的唯一文件(有点像iso646.h)是符合/数据/iso646.h-数据看起来像这样:

#if !defined ISO && !defined POSIX && !defined XPG3 && !defined XPG4
macro and 
macro and_eq
macro bitand
macro bitor
macro compl
macro not 
macro not_eq
macro or
macro or_eq
macro xor 
macro xor_eq

#if !defined ISO && !defined ISO99 && !defined ISO11
allow *_t 
#endif
#endif

但是既然我没有在这里定义macro或者定义它的位置,那么这个文件对我来说是不可理解的。

3 个答案:

答案 0 :(得分:5)

该文件不是libc的一部分,而是编译器。

https://gcc.gnu.org/onlinedocs/gccint/Headers.html

$ find /|grep iso646.h
/usr/lib/gcc/x86_64-linux-gnu/4.8/include/iso646.h
/usr/lib/gcc/x86_64-linux-gnu/4.6/include/iso646.h

答案 1 :(得分:3)

详细阐述了Stian对作为编译器一部分的文件的回答,以及在哪里找到它们:

有各种标准标题是所谓的“独立实现”的一部分。它们只执行#definetypedef,并且不会声明任何实际功能;换句话说,它们只是“标题”,没有任何可链接的代码:

  • <float.h>
  • <iso646.h>
  • <limits.h>
  • <stdalign.h>
  • <stdarg.h>
  • <stdbool.h>
  • <stddef.h>
  • <stdint.h>
  • <stdnoreturn.h>

在某些地方甚至更容易使用编译器而不是定义这些,因为编译器知道有关其平台和它使用的类型,它们的编码,限制,堆栈布局以及如何进行变量参数列表等。

编译器可以为这些头提供“正确”的实现,而不需要任何额外的预处理器“魔术”,如果这些头是由库定义的,这将是必要的。

答案 2 :(得分:2)

作为Stian的回答,另一种查找位置的方法是使用gcc -E

/ * demo.c * /

#include <iso646.h>

int main(void)
{
    return 0;
}

启动:

david@debian:~$ gcc -E demo.c

# 1 "demo.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 1 "<command-line>" 2
# 1 "demo.c"
# 1 "/usr/lib/gcc/x86_64-linux-gnu/4.9/include/iso646.h" 1 3 4
# 2 "demo.c" 2

int main(void)
{
 return 0;
}