c++ 函数声明 & 分离式编译 & 参数传递

p186~p188:

函数声明
1、函数只能定义一次,但是可以声明多次。

2、函数的接口:返回类型 + 函数名 + 形参类型

3、为什么要在头文件中进行函数声明???在源文件中定义?暂时理解到,这么做可以增强可读性。

4、含有函数声明的头文件应该被包含到定义函数的源文件中。(例如:#include "diy.h")

分离式编译 & 6.8 & 6.9

1、分离式编译:把源文件割成好几块放在不同的文件夹下。最终要生成可执行文件,就必须告诉编译器源文件在哪里。
具体操作如下:

>源文件内容(三个文件放在同一个文件夹下面。)

fact.h

int fact(int val);

fact.cpp

#include "fact.h"
int fact(int val)
{
    if (val == 1)
        return 1;
    return val * fact(val - 1);
}

factMain.cpp

#include <iostream>
#include "fact.h"
using namespace std;
int main()
{
    cout << fact(3) << endl; // output=6
    return 0;
}

>开始编译 !

1)一起编译的方法

$ g++ factMain.cpp fact.cpp -o lovecpp -std=c++11

$ lovecpp
6

2)真*分离式编译

第一步

$ g++ -c factMain.cpp

$ g++ -c fact.cpp

执行这两个操作后会生成fact.o、factMain.o,接下来要把object code(*就是.o文件)链接成可执行文件。

$ g++ factMain.o fact.o -o lovecpp

执行后生成lovecpp.exe。这样分几步的好处是:如果修改了其中一个源文件,就重新编译改动的就好了。

6.10

#include <iostream>
using namespace std;
void swap(int *p, int *q)
{
    int temp;
    temp = *p;
    *p = *q;
    *q = temp;
}
int main()
{
    int a = 3, b = 4;
    cout <<    a << " " << b << endl;
    swap(a , b);
    // 交换之后
    cout <<    a << " " << b << endl;
    /* output:
     3 4
     4 3
     */
    return 0;
}
时间: 2024-12-14 12:53:17

c++ 函数声明 & 分离式编译 & 参数传递的相关文章

(转)c++模板函数声明定义分离编译错误详解

当我们声明和定义一个模板的时候,必须要让声明和定义放在一个文件里.否则编译器会报错. 这就是为什么boost的实现文件的后缀名是hpp了. 这其中的理由是什么呢?为什么会这样? 首先,一个编译单元(translation unit)是指一个.cpp文件以及它所#include的所有.h文件,.h文件里的代码将会被扩展到包含它的.cpp文件里,然后编译器编译该.cpp文件为一个.obj文件(假定我们的平台是win32),后者拥有PE(Portable Executable,即windows可执行文

参数传递--函数声明与变量声明优先级?

javascript是一门解释性语言,自然没有编译过程,但在脚本执行之前会有语法检查和执行环境的构建,我们把这一过程姑且称为预处理吧. 一.函数声明,javaScript解析器把函数提升 fn();  //output  2 var fn= function(){ console.log(1); } function fn(){ console.log(2); } fn();  //output  1 首先,后面的fn()函数声明提前,所以第一个fn() 为2 其次,后面定义的fn()覆盖前面声

js预编译环节 变量声明提升 函数声明整体提升

预编译四部曲 1.创建AO对象 2.找形参和变量声明,将变量和形参名作为AO属性名,值为undefined 3.将实参和形参统一 4.在函数体里面找函数声明,值赋予函数体 function fn(a){ console.log(a) //function a(){} var a = 123; console.log(a)//123 function a(){} console.log(a)//123 var b = function(){} console.log(b) //function()

分离式编译

<c++ primer> p186: 举个例子fact函数的定义位于一个名为fact.cc的文件中,它的声明名为Chapter6.h的头文件中.显然与其他用到fact函数的文件一样,fact.cc应该包含Chapter6.h头文件.另外,我们在名为factmain.cc的文件中创建main函数,main函数将用到fact函数.要生成可执行文件,必须要告诉程序我们用到的代码在哪.如果我们修改了其中一个源文件,那么只需要重新编译那个改动了的文件.大多数编译器提供了分离式编译每个文件的机制,这一过程

C++ 之 类模板的分离式编译

模版编译篇 目录:1.对于C++中类模板的分离式编译的认识 2.具体的实例 1.对于C++中类模板的分离式编译的认识 为什么C++编译器不能支持对模板的分离式编译(博文链接) 主要内容:编译器编译的一般工作原理.对模版的分离式编译的特殊性(模版的特殊性) 链接: http://blog.csdn.net/pongba/article/details/19130 模版编译的特殊性 对程序进行编译时,对于函数调用,编译器只要求函数的原型在调用点是可见的,至于函数的定义是否存在不做检查(在对程序进行链

分离式编译时 链接器工具错误 (一个变量被定义一次或多次)

在编写程序时,将类中的函数成员的声明和定义分开,在头文件(.h)中进行声明,在源文件(.cpp)中进行定义 以及具体功能的实现.达到分离式编译的效果,提高代码的可读性. 自己在编写是程序时,程序显示没有错误,但是在生成时,产生了链接器工具错误LNK2005 的错误提示.这个错误 也会导致另外一个错误LNK1169 找到一个或多个多重定义的符号. 原因是在.cpp 文件内定义函数时加上了 inline  修饰符将函数声明成了内联函数. 内联函数用于优化规模较小,流程直接,频繁调用的函数.通常是将内

“函数声明”、“函数原型”与“函数定义”辨析

最近在看一本关于C的书,对函数声明和函数定义的定义很是模糊,分不清楚,百度了一下,发现一篇帖子写的很是不错,转载过来: 原文: 对函数的“定义”和“声明”不是一回事.函数的定义是指对函数功能的确立,包括指定函数名,函数值类型.形参及其类型以及函数体等,它是一个完整的.独立 的函数单位.而函数的声明的作用则是把函数的名字,函数类型以及形参的类型.个数和顺序通知编译系统,以便在调用该函数时进行对照检查(例如,函数名是否 正确,实参与形参的类型和个数是否一致),它不包括函数体.————谭浩强 ,<C程

javascript中函数声明和函数表达式浅析

记得在面试腾讯实习生的时候,面试官问了我这样一道问题. //下述两种声明方式有什么不同 function foo(){}; var bar = function foo(){}; 当初只知道两种声明方式一个是函数声明一个是函数表达式,具体有什么不同没能说得很好.最近正好看到这方面的书籍,就想好好总结一番. 在ECMAScript中,有两个最常用的创建函数对象的方法,即使用函数表达式或者使用函数声明.对此,ECMAScript规范明确了一点,即是,即函数声明 必须始终带有一个标识符(Identif

万恶之源:C语言中的隐式函数声明

1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自己主动依照一种隐式声明的规则,为调用函数的C代码产生汇编代码.以下是一个样例: int main(int argc, char** argv) { double x = any_name_function(); return 0; } 单纯的编译上述源代码.并没有不论什么报错,仅仅是在链接阶段由于找不到名为any_name_function的函数体而报错. [[email protected] t