最近看了些extern的用法,现做了一些总结如下。
1. 调用 .c 文件 中的全局变量和方法
// common.c
#include <stdio.h>
int num = 100;
char *msg = NULL;
void print(const char *msg)
{
printf("%s\n", msg);
}
// main.c
#include <stdio.h>
extern int num;
extern char *msg;
extern void print(const char *msg);
int main(void)
{
printf("[num] before modify: %d\n", num);
num = 1278;
printf("[num] after modify: %d\n", num);
msg = "hello, main.c here.";
print(msg);
return 0;
}
// makefile
all: main
common.o: common.c
gcc -c common.c
main.o: main.c
gcc -c main.c
main: main.o common.o
gcc main.o common.o -o main
2. .h 文件 中声明变量和方法 .c 文件 中定义对应的变量和方法
// common.h #ifndef _COMMON_H #define _COMMON_H #include <stdio.h> // 头文件中的extern 表示此处声明的变量会在别的文件中给出定义 extern int num; extern char *msg; // 头文件中对方法的extern修饰可以省略,因为:functions are declared extern by default extern void print(const char *msg); #endif
// common.c
#include "./common.h"
// 此处对变量进行定义
int num = 100;
char *msg = NULL;
// 对方法进行定义
void print(const char *msg)
{
printf("%s\n", msg);
}
// main.c
#include "./common.h"
// 声明以下变量和方法可能是在别的文件(模块)中定义的
extern int num;
extern char *msg;
extern void print(const char *msg);
int main(void)
{
printf("[num] before modify: %d\n", num);
num = 1278;
printf("[num] after modify: %d\n", num);
msg = "hello, main.c here.";
print(msg);
return 0;
}
// makefile
all: main
common.o: common.c common.h
gcc -c common.c
main.o: main.c common.h
gcc -c main.c
main: main.o common.o
gcc main.o common.o -o main
3. 如果 c++代码中不调用c的变量或者方法,则用法同c
4. c++中调用c的变量,用法同 c(即只需要在调用处用extern声明下该变量就行了)
5. c++中调用c的方法,此处就关系到c&c++中对于方法名的不同compile方法。因为c++是支持重载的,而c不支持。那么在编译时,对方法名的处理方法两者不相同。
比如同样一个方法 void func(int);
C 编译后可能是 func_
而c++要考虑倒其对方法的重载,那么该方法名在编译后就可能是 func_int_
因此,在c++中要调用 用c写出的方法,那么就要使用倒 extern “C”
#ifdef __cplusplus
Extern “C”
{
Void func(int);
}
#endif
注意:c++调用c中的变量不可在此代码块中声明,应该和普通的一样。直接
extern int xxx; 即可
// common.c
#include <stdio.h>
#include <stdlib.h>
int stdafxii = 10;
void TRACE(const char *process_name, const char *msg)
{
printf("****** -> [%s] %s. <- ******\n", process_name, msg);
}
void PRINT(const char *msg)
{
fputs(msg, stdout);
}
// main.cpp
#include <stdio.h>
//#ifdef __cplusplus
#if defined(__cplusplus)
extern "C"
{
void TRACE(const char *, const char *);
void PRINT(const char *);
}
#endif
//
extern int stdafxii;
int main(void)
{
TRACE(argv[0], "START");
char tmp[128];
memset(tmp, 0x00, 128);
sprintf(tmp, "stdafxii is: %d\n", stdafxii);
PRINT(tmp);
TRACE(argv[0], "END");
return 0;
}
// makefile
all: main
common.o: common.c
gcc -c common.c
main.o: main.c
g++ -c main.c
main: main.o common.o
g++ main.o common.o -o main
over
本文详细介绍了C语言中extern关键字的多种使用场景,包括如何在不同文件间共享变量和函数,如何在C++项目中调用C编写的函数,并解释了C与C++编译器在函数名称处理上的差异。
365

被折叠的 条评论
为什么被折叠?



