当前位置: 首页 > 面试题库 >

为什么C99抱怨存储大小?

鞠乐
2023-03-14
问题内容

这是我在Linux上编译的一些代码:

#include <net/if.h>

int main() {
  struct ifreq ifr;
}

gcc test.c 很好

gcc -std=gnu99 test.c 很好

gcc -std=c99 test.c 失败并显示以下错误:

test.c: In function ‘main’:
test.c:4:16: error: storage size of ‘ifr’ isn’t known

不喜欢struct ifreqLinux中C99的定义与C99有何不同?


问题答案:

这是预处理和GNU C vs C99的一系列后果。

首先,net/if.h

  1. net/if.h 包括 features.h
  2. 稍后,它struct ifreq在一个#ifdef __USE_MISC块内定义。

所以:

  1. 什么__USE_MISC啊 -这是BSD和System V共有的东西
  2. 在这一点上定义了吗?-我们需要检查一下features.h

所以现在features.h

  1. --std=c99默认情况下,当您使用GCC时定义__STRICT_ANSI__(因为这就是C99)
  2. 启用预处理时features.h,如果__STRICT_ANSI__未启用BSD和System V功能,__USE_MISC则未定义。

备份至net/if.hstruct ifreq预处理后甚至不存在! 因此,有关存储大小的投诉

您可以通过以下方法了解整个故事:

vimdiff <(cpp test.c --std=c99 -dD) <(cpp test.c --std=gnu99 -dD)

或以其他任何方式(例如diff --side-by-side)来区别它们,而不是vimdiff

如果您希望使用它进行干净地编译-std=c99,则必须考虑包含_DEFAULT_SOURCE功能测试宏(对于glibc版本> =
2.19;对于旧glibc版本,请使用_BSD_SOURCE_SVID_SOURCE),以便在所提供的功能之上启用所需的功能。 C99。



 类似资料:
  • 问题内容: 具有函数f(x,y,z),我需要求解约束f(x,y,z)= 0,然后对其进行绘制。我试图为每对(y,z)查找f(x,y,z)= 0的值x: Python(2.7.5)说“ TypeError:fsolve:’func’参数’func’的输入和输出形状不匹配。” 但是,如果我自己进行测试,它会具有相同的形状: 返回True。 为什么fsolve()抱怨? 问题答案: 期望参数和的返回值为

  • [Error]org.testng.testngException:无法将@Test annotated方法[testLoginPage]与[interface java.util.Map]插入。有关本机依赖项注入的更多信息,请参阅http://testng.org/doc/documentation-main.html#native-dependent ency-injection at org

  • 我有一个实现Iterable的类,以便用户可以使用迭代器。我使用泛型来允许用户使用任何类型并使用该类。 这是下面的工作代码,没有警告- 但是,如果我将ListIterator定义如下- 我在 Eclipse 中收到警告, 当我在类后指定泛型类型时,它为什么会抱怨?为了能够在我的类中使用Type,我不应该这样做吗?我在定义CustomStackUsingArray时添加了类型,效果很好。

  • 问题内容: 我有一个现有项目,该项目使用@Override的方法会覆盖接口方法,而不是超类方法。我无法在代码中更改它,但是我希望Eclpse不再抱怨注释,因为我仍然可以使用Maven进行构建。 我将如何禁用此错误? 注意:由于项目要求,我需要针对Java 1.5进行编译。 问题答案: 在实现接口声明的方法的方法上使用注释仅从Java 6起有效。这是Java 5中的错误。 确保将你的IDE项目设置为

  • Java 7更改了排序算法,从而抛出 java.lang.IllegalArgumentException:“比较方法违反了其总合同!” 在某些情况下,当使用的比较器有故障时。是否可以确定比较器中的哪种错误导致了这种情况?在我的实验中,如果x!=x,如果x也没有关系 (如果有一个通用的规则,在比较器中寻找bug可能会更容易。但是当然最好是修复所有的bug。:-) ) 特别是,以下两个比较器没有让T

  • 我很少使用HTML和JavaScript,几乎忘记了最基本的内容。错误是什么? DevTools未能加载SourceMap:无法加载的内容https://cdn.jsdelivr.net/npm/@tensorflow/tf。min.js。映射:HTTP错误:状态代码404,网络::错误\u HTTP\u响应\u代码\u失败