问题标签 [gnu99]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 在语句表达式中“重新定义”变量是否安全?
我的问题是关于语句表达式,它是作为 GNU C 中的扩展添加的。考虑以下代码:
编译 ( gcc -Wall -std=gnu99 lala.c -o lala
) 并运行将产生:
这种做法(使用扩展)相当普遍,尤其是container_of
在 Linux 内核中:
与这种情况类似,我想定义一个宏来声明一个局部变量并对其进行处理。但是,我希望这样做不会污染当前范围内可用的变量名,并避免可能的重新定义。我无法在文档中找到关于在重新定义的情况下范围界定如何发生的信息。
在上述情况下,编译器不会发出有关重新定义的警告。我的问题是我是否可以依靠语句表达式内部的变量不会影响外部范围内的同名变量这一事实?
linux - 为什么 C99 抱怨存储大小?
这是我在 Linux 上编译的一些代码:
gcc test.c
很好。
gcc -std=gnu99 test.c
很好。
gcc -std=c99 test.c
失败并出现以下错误:
C99 有什么不同之处在于它不喜欢struct ifreq
Linux 中的定义?
c - 如何在 gnu99 支持的 gcc 中处理“警告:内联函数 `*stat64` 已声明但从未定义”
我包括stat.h
以下foo.c
内容:
当我编译如下:
我收到以下特定于<sys/stat.h>
函数的警告:
我将如何解决这些警告中提到的问题?在我使用 迁移到 C99 支持之前,这似乎不是问题-std=gnu99
,但我不确定为什么。感谢您的任何建议。
c - C 中的按位“非”运算符返回有符号结果
考虑这段代码:
输出是:
0 1 1 1
GCC 发出警告a == ~ ( uint16_t ) 0
:
由于数据类型的范围有限,比较总是错误的 [-Wtype-limits]
为什么按位“非”运算符试图返回有符号值?我怎样才能防止这种情况?
c - 为什么我必须使用 gnu99 而不是 c99 来编译内核模块?
我习惯于-std=c99
在编译应用程序代码时启用 c99 功能。
最近我一直在关注一些基本的内核模块示例,并添加ccflags-y := -std=c99
到 makefile 中。但是,当我尝试制作时,这导致了 17K 行错误。gnu99
完美运行。
内核代码所依赖的 gnu99 和 c99 有什么区别?
c - C99:联合内的灵活数组?
我试图将某些东西从使用 struct hack 转换为使用灵活的数组成员,结果却遇到以下错误消息:
错误:使用灵活数组成员的结构无效
(GCC 4.8.1, gnu99, MinGW)
在尝试追查消息的原因后,我将其提炼为以下相对最小的情况:
换句话说,即使联合是结构的最后一个成员,具有灵活数组成员的结构也不能放入结构中的联合内。
(请注意,将灵活的数组成员直接放在联合中似乎确实有效。)
现在:除了恢复到 struct hack(将 c 声明为长度为 1 的数组)之外,还有什么好的方法可以解决这个问题?指向联合内部结构的指针可以工作,但会受到额外的间接层。
c - 浮动小于 FLT_MIN。为什么是 FLT_TRUE_MIN?
为了了解在浮点下溢的情况下会发生什么,我发现我可以使浮点数比 FLT_MIN 小得多。我在 OS 10.9 上使用 xcode 5.1。语言方言是gnu99。
打印:
浮点最小值为 0.000000 或 1.175494e-38。
下溢为 0.000000 或 4.203895e-45
最小浮点 exp 为 -37。
- 有没有更有效的方法来证明数据类型的限制?
- 为什么 FLT_MIN 实际上不是最小的浮点值?我应该使用其他常量吗?输入上一个问题后,我找到了 FLT_TRUE_MIN。这个数字是多少?
c - NetBSD 上的 libmagic 关闭文件描述符
我正在编写一个 FastCGI 来为网络提供商提供静态内容的 zlib 压缩,但我mmap()
在 NetBSD 上遇到了问题。
当我将 fastCGI 函数转换为 printf()/scanf() 进行调试时,我在 NetBSD 上得到了这个:
压缩器:errno=9:对应于 mmap 手册页描述的 EBADF 的错误文件描述符为fd is not a valid open file descriptor
. 我不明白,因为文件描述符对我来说似乎非常有效,因为它与 fstat 和 libmagic 一起使用。当我通过 sshfs 挂载 NetBSD 文件系统并为 Linux 编译/运行代码时,我得到:
这意味着相同的代码无需任何修改即可在 Linux 上运行。
附加信息:
- uname -a 在 NetBSD 返回
NetBSD odin 6.1.2 NetBSD 6.1.2 (GENERIC) amd64
- Linux 上的 uname -a 返回
Linux localhost.localdomain 3.16.0-rc7-ck2 #1 SMP Fri May 1 13:38:34 CEST 2015 x86_64 GNU/Linux
- gcc-4.5.3 是 NetBSD 上的编译器版本
- gcc-4.9.2是Linux上的编译器版本
- 两种架构都是相同的,并且两个编译器都使用相同的通用标志,并且禁用了所有优化。
更新
似乎出于未知原因magic_descriptor()
正在关闭 NetBSD 上的文件描述符,实际上以下简单代码不起作用:
c - 如果某物是 const volatile int,它可以根据变量的状态而改变吗?
我有一个unsigned const volatile short int*
. 我希望它是 (x + y),在定义时设置为 0。但是,我希望如果由于某种原因 y 更改为 5,我也希望unsigned const volatile short int*
更改。
这在C中可能吗?
(注意:我使用的是带有 GNU 扩展的独立 C99 模式,我的意思是它会自动更改,而不是使用函数。)
c - 有人可以解释这两种引发剂之间的区别吗?
我想知道是否有人可以对以下两段代码之间的差异提供详细、简单的解释。给定以下定义:
有什么区别:
variable_t my_variable;
variable_t my_variable = {};
如果我做第一个,然后从不完全初始化它,为什么编译器不会抛出错误?
注意:我正在编译gcc -std=gnu99
,所以第二个是有效的,并且最终解决了我遇到的问题。我想知道为什么。