今天在编译OpenGL红宝书附带源码中的light.c文件时遇到一个诡异的问题:

如图light .c,在不做任何修改的情况编译OK。然而只要在某些地方写了可执行代码,则会无法通过编译器编译!

(这几行代码如果写在main函数里的第一句则OK)

我用的VS08.我把该文件发给其他朋友(用的VS10),同样也是这样的问题。

然而,我把文件名改成light.cpp后,问题解决了。

现在的问题是,代码文件按的后缀背后,会如何影响编辑器的编译呢?

可以做一个简单的测试

  1. int main()
  2. {
  3. #ifdef __cplusplus
  4. printf("已定义__cpluslus");
  5. #else
  6. printf("未定义__cpluslus");
  7. #endif
  8. return 0;
  9. }

测试结果就是:如果编译的是cpp文件,则编译器会自动帮你加入__cplusplus宏,并使用C++的编译规则。这一点MSDN其实已经明确说明:

赋予文件 .c 扩展名,例如 mysource.c。

Visual C++ 编译器自动假定带 .C 扩展名的文件是 C 文件而不是 C++ 文件,并且拒绝 C++ 语法和关键字(如 public、private 和 class)。

C++ 文件使用 .cpp 扩展名。

再来个非主流的测试。如果编译的既不是.c文件,也不是.cpp文件呢?

笔者把文件扩展名改为light.DD,结果是显示了已定义__cplusplus.也就是说vs默认除了.c文件外,统统认为是c++文件来编译。

奇怪的是,MSDN上是这样描述的:

文件扩展名决定处理文件的方式。扩展名为 .c、.cxx 或 .cpp 的 C 和 C++ 文件将被编译。其他文件(包括 .obj 文件、库 (.lib) 和模块定义 (.def) 文件)将传递给链接器而不经过处理。

现在回到最初的问题。

light.c为什么偏偏在加上了执行代码(哪怕是空代码)也会无法通过编译呢?如果是因为编译器的问题,为什么不加那几行“魔鬼代码”之前是编译ok的呢?

这仅仅是编译器的bug吗?

已经明白了。。
c语言只能在大括号最前面申明变量。。。
坑爹啊。。
 
http://blog.csdn.net/lsldd/article/details/6890943

Visual C++ 编译器自动假定带 .C 扩展名的文件是 C 文件而不是 C++ 文件,并且拒绝 C++ 语法和关键字(c语言只能在大括号最前面申明变量)的更多相关文章

  1. MVC小系列(二十一)【带扩展名的路由可能失效】

    mvc3之后:如果路由带上扩展名,比如这样: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRout ...

  2. PHP中获取当前页面的完整URL、PHP URL处理、获取不带扩展名的文件名

    javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 PHP实现 #测试网址: http://localhost/blog ...

  3. C# 截取带路径的文件名字,扩展名,等等 的几种方法

    C#对磁盘IO操作的时候,经常会用到这些,路径,文件,文件名字,文件扩展名. 之前,经常用切割字符串来实现, 可是经常会弄错. 尤其是启始位置,多少个字节,经常弄晕. 下面这种方法貌似比较简便: st ...

  4. Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)

    Struts2的框架提供了现成的文件下载方式,大大简化了开发下载功能的便利性.网上的例子有很多,我把一些大家普遍比较关注的点,集中一下,给出一个整体方案. 一般我们照着书本或者网上的列子写出了一个De ...

  5. 每天一个linux命令(24)--Linux文件类型与扩展名

    linux 文件类型和Linux 文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如 file.txt  file.tar.gz.这些文件虽然要用不同的程序来打开,但放在Lin ...

  6. C# 获取文件名及扩展名【转】

    https://www.cnblogs.com/libushuang/p/5794976.html C# 获取文件名及扩展名 string aFirstName = aFile.Substring(a ...

  7. C#查看已下载文件大小和扩展名

    FileInfo fi = new FileInfo(fullfile);//fullfile文件路径 ong Size = fi.Length;//查看已下载文件的大小 C# 获取文件名及扩展名 s ...

  8. bat文件调用cmd命令批量提取文件夹中的文件名(批量修改文件扩展名)

    前言: 在平时的工作中,经常需要批量统计文件和数据,如果逐个统计的话太耗时,而且容易出错那么有没有什么快速的方法呢,这里给大家介绍一种简单高效的方法. 方法: 1.打开CMD命令: 按下 Ctrl+R ...

  9. php文件扩展名判断

    <!DOCTYPE> <html> <head> <meta http-equiv="Content-type" content=&quo ...

随机推荐

  1. php利用反射机制查找类和方法的所在位置

    //参数1是类名,参数2是方法名 $func = new ReflectionMethod('UnifiedOrder_pub', 'getPrepayId'); //从第几行开始 $start = ...

  2. svn: E200033: database is locked解决办法

    svn执行update,却被告知database is locked! 执行 svn update,却抛出个错误警报: svn: E200033: database is locked, execut ...

  3. 在Android实现client授权

    OAuth对你的数据和服务正在变成实际上的同意訪问协议在没有分享用户password. 实际上全部的有名公司像Twitter.Google,Yahoo或者LinkedIn已经实现了它.在全部流行的程序 ...

  4. protobuf入门教程

    1.简介和安装 2.消息类型 3.proto3 与 proto2 的区别 4.常用序列化/反序列化接口 5.repeated限定修饰符 6.枚举(enum).包(package) 7.导入定义(imp ...

  5. 删除vector中的重复数据(unique)

    #include <iostream> #include <vector> #include <algorithm> #include <assert.h&g ...

  6. Android组件——使用DrawerLayout仿网易新闻v4.4侧滑菜单

    摘要: 转载请注明出处:http://blog.csdn.net/allen315410/article/details/42914501 概述        今天这篇博客将记录一些关于DrawerL ...

  7. Material Designer的低版本兼容实现 —— ActivityOptionsCompat

    http://www.bubuko.com/infodetail-460163.html

  8. IDEA 多线程Debug

    一.问题描述 在idea中的进行调试时,代码中有多线程,想对线程中的代码进行跟踪,代码如下: for (int i = 0; i < 5; i++) { final int index = i; ...

  9. Vue 兄弟组件之间传递数值

    Vue 兄弟组件之间传值 创建一个公用文件夹,在文件夹中设置一个事件处理中心,即 然后在需要设置值的组件中引入该事件处理中心 import Hub from '../../common/eventHu ...

  10. Netty:一种非易失堵塞client/server相框

    Netty:一种非易失堵塞client/server相框 作者:chszs.转载需注明.博客主页:http://blog.csdn.net/chszs Netty是一个异步事件驱动的网络应用框架,为J ...