C语言,vc编译器cl,如何支持变量不必在函数开始声明

windows,用vc编译器cl.exe,编译nginx的第三方模块,有类似这样的代码报错:

static ngx_int_t

ngx_http_zip_main_request_header_filter(ngx_http_request_t *r)

{

ngx_http_variable_value_t  *vv;

ngx_http_zip_ctx_t         *ctx;

if ((ctx = ngx_http_get_module_ctx(r, ngx_http_zip_module)) != NULL)

return ngx_http_next_header_filter(r);

if ((vv = ngx_palloc(r->pool, sizeof(ngx_http_variable_value_t))) == NULL)

return NGX_ERROR;

/* Look for X-Archive-Files */

ngx_int_t variable_header_status = NGX_OK;

错误出在ngx_int_t variable_header_status = NGX_OK;:

mod_zip/ngx_http_zip_module.c(195) : error C2275: ‘ngx_int_t‘ : illegal use of t

his type as an expression

查了一下,原因:由于c的编译器要求将变量的声名放在一个函数块的头部,而c++没有这样的要求造成的。把声名的三个变量放到函数的开头就可以了。

同样的代码在gcc下是可以编译通过的。

请问vc有没有什么编译选项可以支持高级一点的C。我用的vc编译器已经是vs2012自带的那个了

没有办法。

因为VC哪怕到最新的2013也支持C89标准,因为它本质上是个C++编译器,而你需要的语法是在C99标准后才支持的,所以GCC能编译通过。

解决办法有二:

一,就是把代码更改为符合C89标准。

二,使用mingw编译

编译命令里添加

-c99

Visual Studio 2012 不支持 C99,但是 Visual Studio 2013 支持。

时间: 2024-08-03 23:52:56

C语言,vc编译器cl,如何支持变量不必在函数开始声明的相关文章

编译器--支持变量和语句块的计算器(二)

上篇文章记录了一个简单的计算器,但是只能计算一个表达式,比如计算8+3*5,得到值23.这次在其基础上添加了支持语句的功能,并且支持表达式中存在变量.比如下面: num1 := 5; num2 := num1+3*5; num3 := num1 * (num2 - 20/5); 最后计算并返回的值是num3的值80. 根据这个例子,可以看出相比于上次那个简单的计算器,添加的特性包括1.支持赋值语句  2.支持变量  3.支持多条赋值语句,也就是语句块.其中语句之间使用分号分隔,赋值符号为":=&

黑马程序员————C语言基本语法(关键字、标识符、注释符、变量、Scanf函数)

第一讲 关键字 1.什么是关键字? 1) 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字” 2) C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义 C语言关键字 auto局部变量(自动储存) break 无条件退出程序最内层循环 case   switch 语句中选择项 char  单字节整型数据 const  定义不可更改的常量值 continue 中断本次循环,并转向下一次循环 default switch 语句中的默认选择项 do  用于构成do.....while

go语言的工作空间和GOPATH环境变量

go语言并没有强制一定要使用一定的工作空间和项目结构,对于小型的go程序依靠go run等命令就可以直接编译运行.然而,保持良好的工作空间和文件结构,对于管理源代码和发布程序都是非常有帮助的.对于大型的go语言项目,工作空间则是一定要的. 1.go语言的工作空间结构 go语言的工作空间其实就是一个文件目录,目录中必须包含src.pkg.bin三个目录. 其中src目录用于存放go源代码,pkg目录用于package对象,bin目录用于存放可执行对象.使用go的编译命令工具可以将源代码或packa

C语言 之编译器优化

C语言的编译器会对变量和代码进行一定的优化,我们看下面这个例子. int a,b,c; a=1; b=a; c=b; 这个程序正常运行的时候会这样子:先把a指向的内存空间内放入1 再把a指向的内存空间里的数读出来放到b指向的内存空间, 最后再把b指向的内存空间里的数读出来放到c指向的内存空间里. 然而编译器要对这个程序进行一定的优化,编译的时候,直接把1放入三个内存空间中. 这样子在正常运行的时候确实是好事,但是总会有一些特殊的情况发生,比如,一个中断程序突然改变了a的值,那么会发生这样的情况:

C语言入门(十四)变量的作用域和存储类型

变量的作用域和存储类型 一.作用域和生存期 C程序的标识符作用域有三种:局部.全局.文件.标识符的作用域决定了程序中的哪些语句可以使用它,换句话说,就是标识符在程序其他部分的可见性.通常,标识符的作用域都是通过它在程序中的位置隐式说明的. 1.局部作用域 前面各个例子中的变量都是局部作用域,他们都是声明在函数内部,无法被其他函数的代码所访问.函数的形式参数的作用域也是局部的,它们的作用范围仅限于函数内部所用的语句块. void add(int); main() { int num=5; add(

VC++编译器预编译头功能(stdafx.h)原理与实践

1 现象 在使用VC++应用向导生成的源码框架时,无论是MFC应用程序,还是Win32窗体程序,都会默认启用"预编译头"功能,自动生成stdafx.h和stdafx.cpp这两个文件.以后向项目中增加源文件时,也自动对该源文件启用"预编译头"功能.要求必须在.cpp文件开头加入 #include "stdafx.h" ,否则编译器就会报错:fatal error C1010:在查找预编译头时遇到意外的文件结尾.是否忘记了向源中添加"#i

C语言中变量名及函数名的命名规则与驼峰命名法

一.C语言变量名的命名规则:(可以字母,数字,下划线混合使用) 1. 只能以字母或下划线开始:2. 不能以数字开始:3. 一般小写:4. 关键字不允许用(eg:int float=2//error  float 为保留字不允许用): 二.函数名的命名规则 1.见名知意:2.自定义函数函数名首字母大写(库函数里的函数名都是以小写字母定义,为了区分库函数和自定义函数,避免冲突). 三.宏定义里面的变量 全大写 eg:#define SIZE 100(后面函数所有出现的SIZE全用100代替,它在所有

C语言入门教程-(4)常量和变量

1.常量和变量的概念 程序执行过程中其值不能发生改变的量叫做常量,其值能发生改变的量叫做变量.常量可以直接使用,而变量则必须先定义后才能使用,否则编译器会报错. 2.常量和变量的命名规范 在介绍常量和变量的命名规范之前,我们先了解一下什么是标识符和关键字. 1)标识符 标识符,用来标识符号常量名.变量名.函数名.数组名.文件名.类名.对象名等.简单的将就是大家取的名字~~有效标识符的构成规则如下: 1)第一个字符必须是字母(大小写都行)或下划线,不能是数字; 2)后跟字母(大小写都行).下划线或

Shell下支持变量的重复字符串

Python解决重复字符串是一个很轻松的事,比如说a="james",那么要获得"jamesjamesjames"就是"a*3". 但是这种"*"的字符串乘法在shell里是没有的,比如说"要输出10个a",还不想用for循环来做,怎么办? 首先都知道如果只是想输出1~10这十个数,是很简单的: #echo {1..10}就会得到:1 2 3 4 5 6 7 8 9 10 而使用#seq 1 10也可以,只