码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-07-28 23:50:46      阅读:279      评论:0      收藏:0      [点我收藏+]

标签:知识   编译   chm   attach   open   base   决定   word   拒绝   

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

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

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

 

技术分享

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

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

 

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

可以做一个简单的测试

 

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


测试结果就是:如果编译的是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语言只能在大括号最前面申明变量)

标签:知识   编译   chm   attach   open   base   决定   word   拒绝   

原文地址:http://www.cnblogs.com/findumars/p/7252831.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!