.c文件和.cpp文件导致的编译问题
来源:互联网 发布:好的交友软件 编辑:程序博客网 时间:2024/05/21 11:18
今天在编译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文件和.cpp文件导致的编译问题
- NDK编译cpp和c文件
- .C和.CPP后缀文件的编译区别
- .C文件和.CPP文件的区别
- .c 文件和 .cpp 文件
- .c 文件和.cpp 文件在工程中共存问题
- .c 文件和.cpp 文件在工程中共存问题
- .c和.cpp文件的区别
- 将CPP文件移植成C文件方法和注意的问题
- 编译Qt的cpp文件
- 把cpp改成c才能编译过的文件
- 头文件和.cpp 或.c 文件之间的关系
- MATLAB 调用编译.c/.cpp文件
- C生成文件和.CPP和.C的差别
- cpp文件编译正确 c文件编译一堆错误
- File里面的open导致文件不可编译的问题
- C++Template头文件和定义分开编译的问题
- C++Template头文件和定义分开编译的问题
- 拦截器的三种实现方式!
- 英文版WordPress如何简单变中文
- 一个struts的action跳转大全!
- 使用java读取配置文件(ini、properties)
- java 的继承原理
- .c文件和.cpp文件导致的编译问题
- struts文件上传,各种类型对应的配置类型大全
- 命名空间重名解决方法
- Linux redhat 9.0 中挂载U盘的方法!
- 进程间通信方式
- 利用Flare3D 和Stage3D创建3D Flash游戏[转adobe开发中心]
- HDU_Steps6.2 最短路 HDU2544 HDU2112 HDU1385 HDU2923 HDU2722 HDU2377 HDU3191 HDU3399
- PIC16F877A的USART的使用 第一讲USART发送器
- “Oracle.DataAccess.Client.OracleException: 提供程序与此版本的 Oracle 客户机不兼容”问题的解决方案