标签: gnu99

为什么C99会抱怨存储容量?

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

#include <net/if.h>

int main() {
  struct ifreq ifr;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

与C99有什么不同,它不喜欢struct ifreqLinux中的定义?

linux gcc network-programming c99 gnu99

11
推荐指数
1
解决办法
4973
查看次数

为什么我必须使用gnu99而不是c99来编译内核模块?

我习惯于-std=c99在编译应用程序代码时使用c99功能.

最近我一直在关注一些基本的内核模块示例,并添加ccflags-y := -std=c99到makefile中.然而,当我尝试制作时,这导致17K行错误.gnu99工作得很好.

内核代码依赖的gnu99和c99有什么区别?

c c99 kernel-module linux-kernel gnu99

8
推荐指数
1
解决办法
938
查看次数

C99:联盟内的灵活阵列?

我试图将使用struct hack转换为使用灵活的数组成员,只是遇到以下错误消息:

错误:使用灵活数组成员的结构无效

(GCC 4.8.1,gnu99,MinGW)

在尝试追踪消息的原因之后,我将其提炼到以下相对最小的情况:

struct a {
    union {
        struct {
            int b;
            int c[];
        } d;
    } e;
};
Run Code Online (Sandbox Code Playgroud)

换句话说,具有灵活数组成员的结构看不到能够放入结构中的并集内,即使联合是结构的最后一个成员.

(请注意,将一个灵活的数组成员直接放在联合内部似乎确实有效.)

现在:除了恢复结构黑客(将c声明为长度为1的数组)之外,还有什么方法可以解决这个问题吗?指向联合内部结构的指针可以工作,但是会遇到额外的间接层.

c struct c99 flexible-array-member gnu99

6
推荐指数
1
解决办法
1603
查看次数

漂浮小于FLT_MIN.为什么FLT_TRUE_MIN?

试图看看在浮动下溢的情况下会发生什么,我发现我可以使浮点数比FLT_MIN小得多.我在OS 10.9上使用xcode 5.1.语言方言是gnu99.

#include <stdio.h>
#include <stdlib.h>
#include <float.h>

int main(int argc, const char * argv[])
{
    float underflow = FLT_MIN * 0.0000004;

    printf("Float min is %f or %e.\nUnderflow is %f or %e\nMin float exp is %d.\n", FLT_MIN, FLT_MIN, underflow, underflow, FLT_MIN_10_EXP);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

打印:
Float min为0.000000或1.175494e-38.
下溢为0.000000或4.203895e-45
Min float exp为-37.

  1. 是否有更有效的方法来证明数据类型的限制?
  2. 为什么FLT_MIN实际上不是最小的浮点值?我应该使用其他常量吗?输入上一个问题后,我找到了FLT_TRUE_MIN.这个号码是多少?

c floating-point gnu99

6
推荐指数
2
解决办法
1986
查看次数

C中的按位"非"运算符返回签名结果

考虑以下代码:

uint16_t a = ~ ( uint16_t ) 0;
int16_t  b = ~ ( int16_t ) 0;
printf (
    "%d %d %d %d\n",
    a  == ~ ( uint16_t ) 0,
    a  == ( uint16_t ) ( ~ ( uint16_t ) 0 ),
    b  == ~ ( int16_t ) 0,
    b  == ( int16_t ) ( ~ ( int16_t ) 0 )
);
Run Code Online (Sandbox Code Playgroud)

输出是:

0 1 1 1

海湾合作委员会发出警告a == ~ ( uint16_t ) 0:

由于数据类型的范围有限,比较总是假的[-Wtype-limits]

为什么按位"非"运算符尝试返回有符号值?我怎么能防止这种情况?

c linux gcc gnu99

4
推荐指数
1
解决办法
614
查看次数

C printf 说明符 %lld 打印字符“ld”

我正在使用 gcc (-std=gnu99) 进行嵌入式工具链 (Myriota) 的开发,但 printf 存在问题。

当我尝试以下代码时:

long long int time = TimeGet();
printf("\nSeconds since epoch: %lld\r\n", time);
Run Code Online (Sandbox Code Playgroud)

它打印:

Seconds since epoch: ld
Run Code Online (Sandbox Code Playgroud)

使用"%" PRId64打印相同的“ld”。

有任何想法吗?如果您能指出我正确的地方,我将不胜感激。

编辑 变量类型已更正long long int time

c printf gnu99

3
推荐指数
1
解决办法
1135
查看次数

如何处理"警告:内联函数`*stat64`声明但从未定义"在gcc中支持gnu99

我包括stat.h我的foo.c如下:

#include <sys/stat.h> 
Run Code Online (Sandbox Code Playgroud)

当我按如下方式编译时:

gcc -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -DUSE_ZLIB -DUSE_BZLIB -O0 -g -Wformat -Wall -Wswitch-enum -Wextra -std=gnu99 -DDEBUG=1 -c foo.c -o objects/foo.o -I...
gcc -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE=1 -DUSE_ZLIB -DUSE_BZLIB -O0 -g -Wformat -Wall -Wswitch-enum -Wextra -std=gnu99 -DDEBUG=1 objects/foo.o -o ../bin/debug.foo ../lib/libfoo.a ... -lbz2 -lz
Run Code Online (Sandbox Code Playgroud)

我收到以下警告,这些警告特定于<sys/stat.h>功能:

In file included from foo.c:15:0:
/usr/local/gcc-4.7.2/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/include-fixed/sys/stat.h:317:16: warning: inline function `lstat64` declared but never defined [enabled by default]
/usr/local/gcc-4.7.2/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/include-fixed/sys/stat.h:255:16: warning: inline function `fstat64` declared but never defined [enabled by default]
...
Run Code Online (Sandbox Code Playgroud)

我如何解决这些警告中引用的问题?在我迁移到C99支持之前,这似乎不是问题 …

c linux gcc stat gnu99

1
推荐指数
1
解决办法
5516
查看次数