关于extern的最新总结

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值