最近看了些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