标签: c89

在MS Visual C++中启用VLA(可变长度数组)?

如何在MS Visual C++中启用使用C99中定义的VLA或可变长度数组,或者根本不可能使用?

是的我知道C++标准是基于C89的,并且VGA在C89标准中不可用,因此在C++中不可用,但MSVC++也应该是C编译器,可以使用/ TC编译器参数(Compile as C Code (/TC)).但这样做似乎并没有启用VLA,并且在构建为C++(Compile as C++ Code (/TP))时编译过程失败并出现相同的错误.也许MSVC++ C编译器只符合C89或者我缺少一些东西(一些特殊的构造或pragma/define)?

代码示例:

#include <stdlib.h>

int main(int argc, char **argv)
{
  char pc[argc+5];

  /* do something useful with pc */

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

编译错误:

错误C2057:预期的常量表达式

错误C2466:无法分配常量大小为0的数组

错误C2133:'pc':未知大小

c c99 c89 visual-c++ variable-length-array

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

C中函数指针的递归声明

我想声明一个返回指向同一类型函数的指针的函数.

我想用它来实现如下所示的状态机:

typedef event_handler_t (*event_handler_t)(event_t*); // compilation error

event_handler_t state2(event_t* e);
event_handler_t state1(event_t* e) {
    switch(e->type) {
    //...
    case SOME_EVENT:
        return state2;
    //...
    }

}
event_handler_t state2(event_t* e) {
    switch(e->type) {
    //...
    case OTHER_EVENT:
        return state1;
    //...
    }   
}

//...
event_handler_t event_handler;
//...
event_handler(&e);
//...
Run Code Online (Sandbox Code Playgroud)

我设法使用如下结构解决compliation错误:

typedef struct event_handler {
    struct event_handler (*func)(event_t *);
} event_handler_t;
Run Code Online (Sandbox Code Playgroud)

但这会使返回声明更加复杂:

event_handler_t state2(event_t* e) {
{
    event_handler_t next_handler = {NULL};
    switch(e->type) {
    //...
    case OTHER_EVENT:
        next_handler.func = state1;
        break;
    //...
    } 
    return next_handler;
} …
Run Code Online (Sandbox Code Playgroud)

c c89

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

如何使用GCC编译独立环境?

我正在研究的代码应该可以为托管和独立环境构建,为后一种情况提供某些stdlib函数的私有实现.

我可以在普通的工作站/构建服务器上使用GCC进行可靠的测试吗?使用GCC编译独立环境

  • "-ffreestanding"选项看起来很有前途,但它似乎"只"禁用内置函数并正确设置STDC_HOSTED宏,它仍然提供所有系统头.

  • 选项"-nostdinc"限制性太强; 我仍然想使用独立实现所需的头文件(特别是stddef.h和limits.h).

我在这里错过了什么?

哦,我现在正在使用GCC 4.4.3,很快就会升级到4.5.0.

gcc c99 c89 freestanding

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

警告:此十进制常量仅在ISO C90中无符号

一段代码:

long rangeVar = 0;
rangeVar = atol(p_value);

if (rangeVar >= -2147483648 && rangeVar <= 2147483647)
Run Code Online (Sandbox Code Playgroud)

在编译时,我得到:

警告:此十进制常量仅在ISO C90中无符号

提前致谢

c compiler-construction iso c89 long-integer

20
推荐指数
2
解决办法
3万
查看次数

使用gcc在C语言中键入varargs

很多时候我想要一个函数来接收可变数量的参数,例如以NULL结尾

#define push(stack_t stack, ...) _push(__VARARG__, NULL);
func _push(stack_t stack, char *s, ...) {
    va_list args;
    va_start(args, s);
    while (s = va_arg(args, char*)) push_single(stack, s);
}
Run Code Online (Sandbox Code Playgroud)

如果foo收到非char*变量,我可以指示gcc或clang发出警告吗?类似的东西__attribute__(format),但是对于同一指针类型的多个参数.

c gcc static-analysis c89

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

509最小字符限制的基本原理

我已经看到了ANSI C编译器必须支持的许多最低要求,如函数的31个参数,并且大多数数字似乎都有某种意义.

但是,我看不到在源代码行中支持至少509个字符的原因.511或512会更有意义,但509似乎是任意的.

这个号码的原因是什么?

c c89

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

如何使用make和编译为C99?

我正在尝试使用Makefile编译linux内核模块:

obj-m += main.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
Run Code Online (Sandbox Code Playgroud)

这给了我:

main.c:54: warning: ISO C90 forbids mixed declarations and code
Run Code Online (Sandbox Code Playgroud)

我需要切换到C99.阅读后我注意到我需要添加一个标志-std = c99,不确定它在哪里添加.

如何更改Makefile以便它编译为C99?

linux makefile c99 c89 kbuild

19
推荐指数
3
解决办法
3万
查看次数

C:将double转换为float,保留小数点精度

我想在C中将double转换为float,但希望尽可能保留小数点而不做任何更改......

例如,假设我有

   double d = 0.1108;
   double dd = 639728.170000;
   double ddd = 345.2345678
Run Code Online (Sandbox Code Playgroud)

现在纠正我,如果我错了,我知道浮点精度大约是点后的5个数字.我可以在双点之后得到那五个数字吗?以上结果如下:

   float f = x(d);
   float ff = x(dd);
   float fff = x(ddd);

   printf("%f\n%f\n%f\n", f, ff, fff);
Run Code Online (Sandbox Code Playgroud)

它应该打印

   0.1108
   639728.17000
   345.23456
Run Code Online (Sandbox Code Playgroud)

精度限制之后的所有数字(我假设为5)将被截断.

c floating-point double c89

19
推荐指数
2
解决办法
11万
查看次数

ANSI C或ISO C是否指定-5%10应该是什么?

我似乎记得ANSI C没有指定当模运算符的操作数为负时应该返回什么值(只是它应该是一致的).它是否稍后被指定,或者是否总是被指定并且我记得不正确?

c c99 modulo c89

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

哪个版本的C更适合学生学习 - C89/90或C99?

在下个月开始系统编程之前,我正在研究学习C基础知识和语法.在做一些阅读时,我遇到了C89/99标准.根据维基百科,

C99引入了几个新功能,包括内联函数,几种新数据类型(包括long long int和表示复数的复杂类型),可变长度数组,支持可变参数宏(可变arity的宏)和支持单行以//开头的注释,如BCPL或C++.其中许多已经在几个C编译器中实现为扩展.

C99在很大程度上向后兼容C90,但在某些方面更严格; 特别是,缺少类型说明符的声明不再具有隐式假定的int.标准宏 STDC_VERSION定义为值199901L,表示C99支持可用.GCC,Sun Studio和其他编译器现在支持C99的许多或所有新功能.

我借了一份K&R,第2版,它使用了C89标准.对于学生来说,使用C89是否会使K&R涵盖的某些主题失效,如果是这样,我应该注意什么?

c standards c99 c89

19
推荐指数
2
解决办法
2125
查看次数