首页 > 编程语言 >extern在头文件中添加是否必要?(C/C++)

extern在头文件中添加是否必要?(C/C++)

时间:2024-08-18 20:26:39浏览次数:12  
标签:myFunction 头文件 函数 int C++ extern 声明 变量

在 C 和 C++ 编程中,extern 关键字通常用于表示函数或变量的声明(而非定义),特别是在跨文件使用时。尽管在函数声明中使用 extern 不是强制性的,但它有特定的作用,尤其在变量声明方面。让我们深入探讨一下。

1. 函数声明的基本概念

当你在头文件中声明一个函数时,通常只需要提供函数的原型(即函数名、返回类型和参数列表),例如:

// myheader.h
void myFunction(int a);

在另一个源文件中包含这个头文件时,你就可以调用 myFunction,例如:

// main.c
#include "myheader.h"

int main() {
    myFunction(10);
    return 0;
}

在这种情况下,编译器知道 myFunction 是在另一个文件中定义的,并会在链接阶段查找它的定义。

2. extern 的作用

extern 关键字告诉编译器,某个变量或函数的定义在另一个文件中,而不是当前文件中。对于函数声明,extern 是可选的,因为函数声明默认具有 extern 作用。换句话说,以下两个声明是等价的:

void myFunction(int a);     // 默认是 extern
extern void myFunction(int a); // 显式使用 extern

3. extern 在变量声明中的作用

虽然函数声明可以省略 extern,但对于变量声明,extern 变得非常重要。

假设你有一个全局变量需要在多个文件中共享:

// global.c
int globalVar = 10;

如果你想在另一个文件中访问 globalVar,你需要使用 extern

// main.c
#include "global.h"

extern int globalVar;

int main() {
    globalVar = 20;
    return 0;
}

如果不加 extern,会发生什么呢?编译器会认为这是一个新的全局变量的定义,而不是对 global.c 中定义的变量的引用。这样,每个包含这段代码的文件都会有一个独立的 globalVar 实例。

4. 总结

  • 函数声明:在头文件中声明函数时,extern 是可选的,因为函数声明默认是 extern。函数声明只提供函数的接口,并告诉编译器这个函数在别的地方定义。

  • 变量声明:在多文件共享全局变量时,必须使用 extern 关键字来声明变量,否则编译器会认为是在定义一个新的变量。

在大多数情况下,函数声明不需要显式使用 extern,但了解它的作用是很重要的,尤其是当你处理跨文件的全局变量时。

标签:myFunction,头文件,函数,int,C++,extern,声明,变量
From: https://blog.csdn.net/m0_62342492/article/details/141195221

相关文章

  • C++STL string简单实现
    文章目录前言string接口介绍构造函数迭代器常用容量操作元素访问操作常用操作string简单实现框架构造/析构函数迭代器操作符重载[]+=重载流插入/提取操作符重载常用操作插入删除前言    std::string是C++标准模板库中的一个类,用于处理字符串。与C语言的字符......
  • c++--基础语法
    frompixiv参考博客ChatgptC++基础-知识点修饰符const在C++中,const关键字用于定义不可修改的变量、指针、函数参数和返回值等。它可以增强代码的安全性和可读性,防止意外修改数据。1.常量变量使用const定义的变量是不可更改的常量。一旦赋值,就不能再修改。cons......
  • Qt/C++地图标注点的添加删除移动旋转/指定不同图标和动图/拿到单击信号
    一、前言说明标注点在地图开发中是最常见的应用场景之一,比如在地图上需要显示设备的位置,基本上都是添加标注点,指定图片和尺寸已经经纬度坐标位置。这个功能在每种地图内核中都提供的,这个并没有任何难点,在这个功能点上最大难题或者说是设计细节就是,标注点该如何对齐,比如水滴形状的......
  • C++学习第二课
    一、C++数据类型使用编程语言进行编程时,我们需要用到各种变量来存储各种信息,变量保留的时他所存储的值的内存位置,这意味着,你创建一个变量时,就会在内存中保留一些空间。在我们的编程中我们一般需要的数据类型有比如字符型、宽字符型、整型、浮点型、双浮点型、布尔型等,操作系......
  • C++的第一课
    一、基本语法我们就直接跳过他的介绍了,大家如果想了解可以去官网看看,那么我们就直接进入正题。#include<iostream>usingnamespacestd;intmain(){cout<<"HelloWorld";return0;}那么我们先来看看最简单的HelloWorld的输出,其实呢C++和C的代码书写方式呢......
  • C++Builder XE2 lite精简版
    听说XE8要出了,我这刚从CB6转型到2010不久的,也是眼馋。奈何XE7太大了,平时也只是学习琢磨点小东西,网上找的2010、2011(XE1)的精简版用着挺好,就是感觉不那么稳定。这两天闲着没事做了一个C++BuilderXE2的精简版,测试能用,没有集成第三方控件,带boost库,fmx。纯C++的(顺便鄙视一下那些只做de......
  • 【重学c++primer】第五章第二节 深入浅出:左值和右值
    文章目录左值右值传统的左值和右值划分glvalueprvaluexvalue总结左值和右值的转换左值转右值decltype左值右值传统的左值和右值划分左值:英文为leftvalue,简写lvalue右值:英文为rightvalue,简写rvalue一个左一个右,这个左右的判定是针对什么呢?实际上是针对等......
  • C++实现计算器(菜鸡版*2)
    我写了两种,都是支持小数的(默认从左到右,请自行解括号)别喷我这个很菜,还要用户自己解括号。大部分计算器不都这样吗(包括Windows自带的),而且我还编了一个可以直观的看到公式的。话虽如此,但我还是会努力编出更好用的计算器的喜欢就收藏一下吧第一种:数字/运算符一个一个输入代码:......
  • C++判断素数模板
    首先是朴素方法代码:#include<bits/stdc++.h>usingnamespacestd;intnum;boolcheck(intnum){if(num<2){returnfalse;}for(inti=2;i<=sqrt(num);i++){if(num%i==0){returnfalse;}}returntr......
  • C++(>>)
    目录1.位移操作符(BitwiseRightShiftOperator)2.输入流操作符(StreamExtractionOperator)3.在OpenCV中的重载操作符4.在类中的重载操作符总结在C++中,>>是一个多功能的操作符,根据上下文的不同可以有不同的含义和用途。下面详细介绍其在各种场景中的用法。1.位移操作......