如何在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':未知大小
我想声明一个返回指向同一类型函数的指针的函数.
我想用它来实现如下所示的状态机:
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) 我正在研究的代码应该可以为托管和独立环境构建,为后一种情况提供某些stdlib函数的私有实现.
我可以在普通的工作站/构建服务器上使用GCC进行可靠的测试吗?使用GCC编译独立环境
"-ffreestanding"选项看起来很有前途,但它似乎"只"禁用内置函数并正确设置STDC_HOSTED宏,它仍然提供所有系统头.
选项"-nostdinc"限制性太强; 我仍然想使用独立实现所需的头文件(特别是stddef.h和limits.h).
我在这里错过了什么?
哦,我现在正在使用GCC 4.4.3,很快就会升级到4.5.0.
一段代码:
long rangeVar = 0;
rangeVar = atol(p_value);
if (rangeVar >= -2147483648 && rangeVar <= 2147483647)
Run Code Online (Sandbox Code Playgroud)
在编译时,我得到:
警告:此十进制常量仅在ISO C90中无符号
提前致谢
很多时候我想要一个函数来接收可变数量的参数,例如以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)
,但是对于同一指针类型的多个参数.
我已经看到了ANSI C编译器必须支持的许多最低要求,如函数的31个参数,并且大多数数字似乎都有某种意义.
但是,我看不到在源代码行中支持至少509个字符的原因.511或512会更有意义,但509似乎是任意的.
这个号码的原因是什么?
我正在尝试使用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?
我想在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)将被截断.
我似乎记得ANSI C没有指定当模运算符的操作数为负时应该返回什么值(只是它应该是一致的).它是否稍后被指定,或者是否总是被指定并且我记得不正确?
在下个月开始系统编程之前,我正在研究学习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涵盖的某些主题失效,如果是这样,我应该注意什么?
c89 ×10
c ×8
c99 ×5
gcc ×2
double ×1
freestanding ×1
iso ×1
kbuild ×1
linux ×1
long-integer ×1
makefile ×1
modulo ×1
standards ×1
visual-c++ ×1