本文目录一览:
1、C语言 在外部定义结构类型? 2、C语言如何定义外部结构体? 3、有关C语言的内部函数和外部函数的定义说明 4、c语言 静态变量和寄存器变量可以定义外部变量吗?定义有什么条件 5、C语言中如何申明外部定义的结构体数据。 6、C语言关于外部变量声明与定义
C语言 在外部定义结构类型?
这样做是不对的 应该这样: 文件str.h
struct STR
{
int a;
int b;
};
注意这里不要声明变量 文件str.cpp
#include "str.h"
struct STR str; // 在这里声明
文件main.cpp
#include <stdio.h>
#include "str.h"
extern struct STR str; // 这样就可以引用外部变量了
int main(void)
{
str.a = 8;
return 0;
}
总结:
1、#include
只引用头文件,不要引用程序文件
2、#include
只声明类型,不要声明变量,因为多次引用会对同一变量多次分配内存,是错误的重复定义;
3、变量定义必须放在程序体文件,这样在其他程序体只要声明extern
就可以引用了
C语言如何定义外部结构体?
把这个结构体放在一个.h文件中。其他c文件引用这个.h文件。 type.h
#ifndef type_h
#define type_h
struct ABC
{
unsigned a;
unsigned b;
} abc;
#endif
qita.c
#include "type.h"
int main()
{
abc.a = 6;
}
有关C语言的内部函数和外部函数的定义说明
有两种理解:
(1) 库函数是C语言的内部函数或自带函数,外部函数即程序员自定函数。
(2) 凡加写了extern
的函数是外部函数。
第一种理解好懂:
C语言的内部函数指的是C语言自带的函数,无论是动态链接的或静态链接的。这些函数通过C语言的头文件定义了。
例如,sin()
、cos()
等数学函数在math.h
中定义了,输入输出函数printf()
、fgetc()
在stdio.h
中定义了,时间函数如time()
、ctime()
等在time.h
中定义了。还有许多其他内部函数。编程时,只要用#include <库名.h>
写在编程头部,程序中就可调用。
自定义函数,就是用户自己写的函数。
第二种:凡加写了extern
的函数是外部函数:
自定义函数可以与程序的main()
写在同一个文件中,也可以写在另一个文件中,这时你可能还另写自己的头文件或者写extern
...,告诉编译器,main
中用到的某某函数是“外部函数”。
例如,main()
在a.c
中,自定义函数my_func()
在a2.c
中
a.c内容:
#include <stdio.h>
extern float my_func(float a);
main()
{
printf("result=%f\n", my_func(2.0));
}
a2.c内容:
float my_func(float a)
{
return a;
}
编译:
cl -c a.c # 得到a.obj
cl -c a2.c # 得到a2.obj
cl a.obj a2.obj # 链接成a.exe
运行:
a.exe
得:
result=2.000000
extern float my_func()
是外部说明,告诉编译器,main()
里的my_func
是外部函数,要通过链接(.obj)得到。
如果把my_func
写在a.c
里:
#include <stdio.h>
float my_func(float a)
{
return a;
}
main()
{
printf("result=%f\n", my_func(2.0));
}
my_func()
就不是外部函数。
编译:
cl a.c # 得a.exe
运行:
a.exe
得:
result=2.000000
c语言 静态变量和寄存器变量可以定义外部变量吗?定义有什么条件
static
修饰函数:
在修饰非成员函数时表示该函数不是全局函数,而仅供本文件使用;
在修饰成员函数时,表示该函数只能调用类的静态成员变量并且该方法可以不必经由实例化的类对象就能够应用;
static
修饰变量:
修饰全局变量时,该变量只能供本文件内部使用;
修饰成员变量时,该变量成为类变量,存储在静态存储区中,不经过类实例就可以访问该变量;
修饰局部变量时,该变量在函数第一次被调用时初始化,并将其存放到静态存储区,函数退出后变量值保持不变,下一次进入函数时将跳过对它的初始化,它的生命周期直到程序退出。
最后,要说明的是,static
变量在全局中只有一份,不会有多份拷贝。
extern
用于声明变量时,如果不指出变量的类型,则默认为int
,如果不是int
的,必须显示指出变量的类型,否则出错。
extern
实际上只对变量有用,对函数而言,只是个幌子(能够更加清晰明了的让我们知道也让编译器知道该函数可以用于“外交”),没有实质性的作用,以后记住了,看到extern
和函数扯上关系,你理都不用理,直接把它拿掉就OK了。但是它还是有那么一点用的,既然“存在的就是合理的”,那么它必然有点用啦,利用它可以在程序中取代#include "*.h"
来声明函数,在一些复杂的项目中,我比较习惯在所有的函数声明前添加extern
修饰。
本质上,我认为,函数可以将声明和定义分开,而变量就不行了,因此只能借助于extern
来实现这一点,要是变量也能将声明和定义分开,或许extern
根本就不该活在这个世上。
extern
可以被写在变量/函数的声明/定义处,但是标准的用法应该只是将其写在声明处,写在定义处只不过为了再次强调或直观明了而已。
C语言中如何申明外部定义的结构体数据。
方法一:文件包含
// a.c
#include <stdio.h>
#include <stdlib.h>
#include "c.c"
main()
{
int b;
g->v = 1;
b = a(1);
printf("%d", g->v);
}
// c.c
#include <stdio.h>
int a(int x)
{
printf("%d", x);
return 0;
}
方法二:头文件
// a.c
#include <stdio.h>
#include <stdlib.h>
#include "b.h"
main()
{
int b;
g->v = 1;
b = a(1);
printf("%d", g->v);
}
// b.h 定义一个头文件
int a(int x);
struct gg;
// c.c
#include <stdio.h>
int a(int x)
{
printf("%d", x);
return 0;
}
struct gg
{
int v;
} *g;
方法三:外部变量
// c.c
#include <stdio.h>
extern b;
typedef struct gg
{
int v;
} b, *g;
C语言关于外部变量声明与定义
不要在共同#include
的头文件里定义。
把变量定义在其中一个C文件又或者只有它才用的头文件里。例如:
int share;
然后在其他要用的C文件中使用:
extern int share;
来声明。