windows_vs编译过程
visual studio 2010 编译程序时,首先是cpp经过预处理,处理掉#define,#include等等。#include部分,将头文件部分替换到cpp中。之后进行优化过程,到.s。之后进入汇编,变成.obj。之后是将.obj链接在一起变为exe。
在这个过程中,比如 a.cpp,b.cpp都引入了c.h。
c.h中写下:
- class Test{
- };
- enum xxx{
- aaa =,
- bbb =,
- };
- struct abc{
- };
这些都是可以通过编译的。但是写下int x; 就无法通过编译,重复定义。
即使我们写成
- #ifndef TEST_H
- #define TEST_H
- class Test{
- };
- enum xxx{
- aaa =,
- bbb =,
- };
- struct abc{
- };
- int x;
- #endif
还是会出现错误。
这是因为各自在由cpp生成到obj的过程中,引入头文件都是独立进行的。 ifndef的作用仅仅是一个cpp使用了很多次#include xxx.h 所带来的冲突。比如a.cpp引入了yyy.h,引入了xxx.h,同时xxx.h又引入了yyy.h,这样的话ifndef就会起作用。
当一个obj,链接到另外一个obj时,实际上include已经替换完毕。int x;会出现重复定义的问题。
而class就可以重复。即,每一个cpp都可以拥有一个类的一次定义,多次的话需要ifndef避免。
class A{};即是定义,又是声明。
class A;是声明。
在a.cpp中define
- #define TEST
- #ifdef TEST
- #pragma message("TEST was defined! Found in a.cpp!")
- #endif
在b.cpp中define
- #ifdef TEST
- #pragma message("TEST was defined! Found in b.cpp!")
- #endif
这样在编译后,
只输出"TEST was defined! Found in a.cpp!"
a中define的内容,b是看不到的。
编译是以cpp为单元进行编译的。各自独立的进行。
一个编译单元只能定义一次class,不能多次定义class。
不同编译单元各自定义一个class一次是可以的。
windows_vs编译过程的更多相关文章
- Android工程的编译过程
现在很多人想对Android工程的编译和打包进行自动化,比如建立每日构建系统.自动生成发布文件等等.这些都需要我们对Android工程的编译和打包有一个深入的理解,至少要知道它的每一步都做了什么,需要 ...
- GCC编译过程
以下是C程序一般的编译过程: gcc的编译流程分为四个步骤,分别为:· 预处理(Pre-Processing) 对C语言进行预处理,生成*.i文件.· 编译(Compiling) 将上一步生成的*.i ...
- Linux系统GCC常用命令和GCC编译过程描述
前言: GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言.GCC 很快地扩展,变得可处理 C++.后来又 扩展能够支持更多编程语言,如Fortran. ...
- Hadoop源码编译过程
一. 为什么要编译Hadoop源码 Hadoop是使用Java语言开发的,但是有一些需求和操作并不适合使用java,所以就引入了本地库(Native Libraries)的概念,通 ...
- gcc编译过程简述
在linux系统上,从源文件到目标文件的转化是由编译器完成的.以hello.c程序的编译为例,如下: dfcao@linux: gcc -o hello hello.c 在这里,gcc编译器读取源文件 ...
- android 编译过程
引用:http://www.cnblogs.com/devinzhang/archive/2011/12/20/2294686.html http://blog.sina.com.cn/s/blog_ ...
- [转]UE4 Blueprint编译过程
Blueprint 编译概述 一.术语 Blueprint,像C++语言一下的,在游戏中使用前需要编译.当你在BP编辑器中,点击编译按钮时候,BP资源开始把属性和图例过程转换为一个类对象处理. 1 ...
- TextMate2 最新版下载及源码编译过程
TextMate2 已经开源,我刚编译成功,如果有需要的同学可以点击下面百度网盘的链接下载.我系统版本是:Mac OS X 10.8.4. TextMate version 2.0-alpha.946 ...
- C语言的编译过程、安装gcc编译器以及设置环境变量
以我对C语言编译过程的了解,我用了一点时间画了一个图,提供给大家参考一下,希望有些能对您的问题提上帮助. 前几天刚初步学习了C语言的编译过程,感触挺深的.在C语言中头文件其实起了一个很大的作用. 1. ...
随机推荐
- Window下PHP环境配置使用Redis总结
什么是Redis? Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的API.它和Memcached类似,它支持存储的 ...
- 使用discriminator实现鉴别器
1在人员接口实现方法 public Employee getEmpByIdStep(Integer id); 2在映射文件进行配置 <!-- public Employee getEmpById ...
- 洛谷P1190 接水问题
题目名称:接水问题 题目来源 [洛谷P1190] (https://www.luogu.org/problemnew/show/P1190) 题目描述 学校里有一个水房,水房里一共有\(m\)个龙头 ...
- hdu6599 I Love Palindrome String
由样例可知,题目中求的回文串数量,其实是本质不同的回文串数量,这个可以直接用回文树来做. 考虑前半段是回文串这个限制,这个东西回文树不好做,可以再套一个马拉车,然后记录一下插入到回文树的节点中最后一个 ...
- spring hibernate 事务整合 使用测试类 事务不自动提交的问题!!!
使用JUnit 测试hibernate 事务管理的时候应注意 ,测试类完成是默认回滚的. 所以只能查询数据库却不能增删改数据库. 应该在测试类上面加上注解 @Rollback(false) 表似默认 ...
- Python 笔试集(2):你不知道的 Python 整数
面试题 分别给出下述代码在终端(e.g. IPyhon)中和在程序中的运行结果: a = 256 b = 256 c = 257 d = 257 def foo(): e = 257 f = 257 ...
- 红帽虚拟化RHEV-安装RHEV-M
目录 目录 前言 软件环境 时间同步 更新系统 安装并配置RHEV-M 添加域并为用户授权远程登陆 安装rhevm报告 安装Spice协议 最后 前言 在红帽虚拟化RHEV-架构简介篇中介绍了RHEV ...
- Linux_SystemLogManager
目录 目录 前言 日志管理journalctl工具 日志服务属性 自定义日志 journalctl 指令 前言 还是RHEL7的新特性,引入了journalctl指令作为系统日志的管理工具. 日志管理 ...
- 测开之路一百五十三:ajax之load、get、ajax在项目中的体现
在查询的时候是使用ajax进行请求的 目录结构 personal.models from datetime import datetimefrom flask_sqlalchemy import SQ ...
- 用U盘完成win10系统的安装
电脑太卡了,每次都要重装,然后每次忘记要从哪里开始动手,都要百度,仅以此篇记录下 目录 1.系统盘准备 2.从U盘启动安装 1.系统盘准备 第一步:在电脑中完成系统盘制作工具的安装,由于它是要依赖.n ...