这是我在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中的定义?
我习惯于-std=c99在编译应用程序代码时使用c99功能.
最近我一直在关注一些基本的内核模块示例,并添加ccflags-y := -std=c99到makefile中.然而,当我尝试制作时,这导致17K行错误.gnu99工作得很好.
内核代码依赖的gnu99和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的数组)之外,还有什么方法可以解决这个问题吗?指向联合内部结构的指针可以工作,但是会遇到额外的间接层.
试图看看在浮动下溢的情况下会发生什么,我发现我可以使浮点数比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.
考虑以下代码:
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]
为什么按位"非"运算符尝试返回有符号值?我怎么能防止这种情况?
我正在使用 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
我包括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支持之前,这似乎不是问题 …