Visual C++ 编译器自动假定带 .C 扩展名的文件是 C 文件而不是 C++ 文件,并且拒绝 C++ 语法和关键字(c语言只能在大括号最前面申明变量)
今天在编译OpenGL红宝书附带源码中的light.c文件时遇到一个诡异的问题:
如图light .c,在不做任何修改的情况编译OK。然而只要在某些地方写了可执行代码,则会无法通过编译器编译!
(这几行代码如果写在main函数里的第一句则OK)

我用的VS08.我把该文件发给其他朋友(用的VS10),同样也是这样的问题。
然而,我把文件名改成light.cpp后,问题解决了。
现在的问题是,代码文件按的后缀背后,会如何影响编辑器的编译呢?
可以做一个简单的测试:
- int main()
- {
- #ifdef __cplusplus
- printf("已定义__cpluslus");
- #else
- printf("未定义__cpluslus");
- #endif
- return 0;
- }
测试结果就是:如果编译的是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语言只能在大括号最前面申明变量。。。
坑爹啊。。
Visual C++ 编译器自动假定带 .C 扩展名的文件是 C 文件而不是 C++ 文件,并且拒绝 C++ 语法和关键字(c语言只能在大括号最前面申明变量)的更多相关文章
- MVC小系列(二十一)【带扩展名的路由可能失效】
mvc3之后:如果路由带上扩展名,比如这样: public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRout ...
- PHP中获取当前页面的完整URL、PHP URL处理、获取不带扩展名的文件名
javascript实现: top.location.href 顶级窗口的地址this.location.href 当前窗口的地址 PHP实现 #测试网址: http://localhost/blog ...
- C# 截取带路径的文件名字,扩展名,等等 的几种方法
C#对磁盘IO操作的时候,经常会用到这些,路径,文件,文件名字,文件扩展名. 之前,经常用切割字符串来实现, 可是经常会弄错. 尤其是启始位置,多少个字节,经常弄晕. 下面这种方法貌似比较简便: st ...
- Struts2 文件下载(中文处理方法以及控制下载文件名称和扩展名)
Struts2的框架提供了现成的文件下载方式,大大简化了开发下载功能的便利性.网上的例子有很多,我把一些大家普遍比较关注的点,集中一下,给出一个整体方案. 一般我们照着书本或者网上的列子写出了一个De ...
- 每天一个linux命令(24)--Linux文件类型与扩展名
linux 文件类型和Linux 文件的文件名所代表的意义是两个不同的概念.我们通过一般应用程序而创建的比如 file.txt file.tar.gz.这些文件虽然要用不同的程序来打开,但放在Lin ...
- C# 获取文件名及扩展名【转】
https://www.cnblogs.com/libushuang/p/5794976.html C# 获取文件名及扩展名 string aFirstName = aFile.Substring(a ...
- C#查看已下载文件大小和扩展名
FileInfo fi = new FileInfo(fullfile);//fullfile文件路径 ong Size = fi.Length;//查看已下载文件的大小 C# 获取文件名及扩展名 s ...
- bat文件调用cmd命令批量提取文件夹中的文件名(批量修改文件扩展名)
前言: 在平时的工作中,经常需要批量统计文件和数据,如果逐个统计的话太耗时,而且容易出错那么有没有什么快速的方法呢,这里给大家介绍一种简单高效的方法. 方法: 1.打开CMD命令: 按下 Ctrl+R ...
- php文件扩展名判断
<!DOCTYPE> <html> <head> <meta http-equiv="Content-type" content=&quo ...
随机推荐
- php正则怎么使用(最全最细致)
php正则怎么使用(最全最细致) 一.总结 一句话总结: 1.正则中的行定位符是什么? 解答:(^与$) 2.正则中什么时候用行定位符? 解答:如"^de",表示以de开头的字符串 ...
- VC++中用API调用对话框资源
关键技术: 对于资源的载入须要几个API函数,以下分别介绍这几个API函数. a) FindResource 用来在一个指定的模块中定位所指的资源,语法例如以下: HRSRC FindResource ...
- Erlang 日期和时间处理、时间戳转换
http://www.csdn 123.com/html/blogs/20131113/95993.htm 获取当前时间 erlang:now()得到的是从1970年1月1日零时起,到现在经过的时间, ...
- 一起学Python:字典介绍
字典介绍 想一想: 如果有列表 nameList = ['xiaoZhang', 'xiaoWang', 'xiaoLi']; 需要对"xiaoWang"这个名字写错了,通过代码修 ...
- Maven 学习总结
1. 下载地址 Maven: http://maven.apache.org/download.cgi 2. 为Maven配置本地仓库和远程仓库 修改 Maven 目录中 con ...
- 【28.57%】【codeforces 711E】ZS and The Birthday Paradox
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- AbsoluteLayout绝对布局
1.四大控制属性(单位都是dp): ①控制大小: android:layout_width:组件宽度 android:layout_height:组件高度 ②控制位置: android:layout_ ...
- ThoughtWorks、Teambition、Trello、Slack、DevCloud 主流敏捷软件开发工具平台比较
在大公司做了6年程序员,2年项目经理的小王,正在创业公司迎来他焦虑的而立之年. 但是对于3个月前加入创业公司的决定,他现在有些烦躁和怀疑人生.在他过往的经验看来,公司新接的小项目,在过去的大公司里1个 ...
- JSP页面中taglib的uri设置
今天遇到这样一个问题,使用JAVA做了个WEB应用,其中用到一个自定义标签.该标签的class文件与tld(tld文件中,uri定义为:http://wallimn.iteye.com/myfuncs ...
- Verilog分频器
verilog设计进阶 时间:2014年5月6日星期二 主要收获: 1.自己动手写了第一个verilog程序. 题目: 利用10M的时钟,设计一个单周期形状例如以下的周期波形. 思考: 最開始的想法是 ...