栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实操 - 如何判断外部引用数组的大小 & 如何外部引用常量

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实操 - 如何判断外部引用数组的大小 & 如何外部引用常量

在C语言中,在一个文件中定义的数组,在另一个文件中使用时,sizeof操作符是不能使用的。

file1.c:                 

int array[ ] = {1, 2, 3};        

file2.c:

extern int array[ ];

一个未指定大小的外部数组是一个不完整的类型;你不能对它应用sizeof。sizeof在编译时操作,没有办法了解一个在其他文件中定义的数组的大小。

你有三个选择:

第一个:

在定义数组的同一个源文件中声明一个包含数组大小的配套变量,并对其进行定义和初始化(用sizeof)。

file1.c:

int array[] = {1, 2, 3};

int arraysz = sizeof(array);

file2.c:

extern int array[ ];

extern int arraysz;

第二个:

为大小定义一个常量,这样它就可以在定义和extern声明中统一使用。

file1.h。

#define ARRAYSZ 3

extern int array[ARRAYSZ]。

file1.c:

#include "file1.h"        

int array[ARRAYSZ]。

file2.c:

#include "file1.h"

第三个:

在数组的最后一个元素中使用一些哨兵值(通常是0,-1,或NULL),这样代码就可以在没有明确的大小指示的情况下确定结束。

file1.c:

int array[] = {1, 2, 3, -1};

file2.c:

extern int array[ ];

(显然,选择在一定程度上取决于数组是否已经被初始化;如果已经被初始化,那么选项2就很糟糕)。

------------------------------------- 

上面说的第一种方法里,可以将数组的长度定义为常数,这个长度编译时就确定并且后面不会更改。

file1.c:

int array[] = {1, 2, 3};

const int arraysz = sizeof(array)/sizeof(array[0]);


file2.c:

#include 

extern int array[ ];




extern const int arraysz; 


int main()
{
  printf("%dn", array[arraysz-1]);

  return 0;
}


$ gcc -o test file1.c file2.c

如果使用C++的话,就要注意在定义常量时也要加上extern,因为C++的const变量默认是static的。

file1.cpp:

int array[] = {1, 2, 3};

extern const int arraysz = sizeof(array)/sizeof(array[0]);



file2.cpp:

#include 
extern int array[ ];





extern const int arraysz;



int main()
{
  printf("%dn", array[arraysz-1]);
  return 0;
}


$ g++ -o test file1.cpp file2.cpp

在C++中,在定义常量的源文件中,要在定义时加上extern修饰符,或者多加一个extern的声明也可以。

// 1, 定义并初始化时加extern

extern const int length = 10;

// 2, 初始化时不加extern,单独用extern声明

extern const int length;

const int length = 10;

// 3,  初始化和声明都加extern也可以。

extern const int length;

extern const int length = 10;

参考:

http://www.c-faq.com/decl/extarraysize.html

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/605213.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号