c++ extern 关键字

C++中的extern关键字和跨语言互操作

变量的声明与定义

extern关键字用于声明在另一个翻译单元(文件)中定义的变量或函数。通过extern关键字,可以在多个文件中访问全局变量或函数。

变量声明示例

文件:main.cpp

cpp 复制代码
#include <iostream>

// 声明外部变量
extern int globalVariable;

int main() {
    std::cout << "全局变量: " << globalVariable << std::endl;
    return 0;
}

文件:global.cpp

cpp 复制代码
// 定义外部变量
int globalVariable = 42;

函数声明示例

文件:main.cpp

cpp 复制代码
#include <iostream>

// 声明外部函数
extern void printMessage();

int main() {
    printMessage();
    return 0;
}

文件:functions.cpp

cpp 复制代码
#include <iostream>

// 定义外部函数
void printMessage() {
    std::cout << "来自另一个文件的消息!" << std::endl;
}
编译

要编译并链接这些文件,可以使用如下命令:

bash 复制代码
g++ main.cpp global.cpp functions.cpp -o myProgram

extern "C" 来与 C 代码进行互操作

extern "C"关键字在 C++ 中用于指示编译器以 C 语言的方式来处理声明的函数或变量,从而实现 C 和 C++ 代码的互操作。

C 代码部分

文件:example.c

c 复制代码
#include <stdio.h>

// 这是一个 C 函数
void hello_from_c() {
    printf("Hello from C!\n");
}

// 这是一个接受两个整数并返回它们和的 C 函数
int add(int a, int b) {
    return a + b;
}

C++ 代码部分

文件:main.cpp

cpp 复制代码
#include <iostream>

// 使用 extern "C" 来声明 C 函数
extern "C" {
    void hello_from_c();
    int add(int a, int b);
}

int main() {
    // 调用 C 函数
    hello_from_c();

    // 调用 C 的加法函数
    int result = add(3, 4);
    std::cout << "The result of add(3, 4) is: " << result << std::endl;

    return 0;
}
编译和运行

要编译和运行这个程序,需要执行以下步骤:

  1. 首先编译 C 文件:

    bash 复制代码
    gcc -c example.c -o example.o
  2. 然后编译 C++ 文件并链接 C 文件:

    bash 复制代码
    g++ main.cpp example.o -o main
  3. 最后运行生成的可执行文件:

    bash 复制代码
    ./main

执行后,应该会看到以下输出:

复制代码
Hello from C!
The result of add(3, 4) is: 7

与 C 代码共享全局变量

C++ 代码可以访问 C 代码中定义的全局变量,反之亦然。

C 代码

文件:example.c

c 复制代码
int shared_variable = 10;

void print_shared_variable() {
    printf("Shared variable: %d\n", shared_variable);
}

C++ 代码

文件:main.cpp

cpp 复制代码
#include <iostream>

extern "C" {
    extern int shared_variable;
    void print_shared_variable();
}

int main() {
    std::cout << "Shared variable in C++: " << shared_variable << std::endl;
    print_shared_variable();
    return 0;
}

与 C 库的互操作

通过extern "C",可以在 C++ 中使用用 C 编写的库。

C 库头文件

文件:mylib.h

c 复制代码
#ifndef MYLIB_H
#define MYLIB_H

void c_function();

#endif

C 库实现

文件:mylib.c

c 复制代码
#include "mylib.h"
#include <stdio.h>

void c_function() {
    printf("Function from C library\n");
}

C++ 代码

文件:main.cpp

cpp 复制代码
#include <iostream>

extern "C" {
    #include "mylib.h"
}

int main() {
    c_function();
    return 0;
}

抑制编译器对未使用参数的警告

为了避免编译器对未使用参数发出警告,可以使用如下方法:

cpp 复制代码
void func(int signal) {
    (void)signal; // 忽略未使用的参数warning
}

这一行是一种显式标记signal参数为未使用的方式,从而抑制编译器的警告。

相关推荐
Amour恋空7 分钟前
Java多线程
java·开发语言·python
小陈工12 分钟前
2026年3月28日技术资讯洞察:5G-A边缘计算落地、低延迟AI推理革命与工业智造新范式
开发语言·人工智能·后端·python·5g·安全·边缘计算
第二只羽毛33 分钟前
C++ 高并发内存池1
大数据·开发语言·c++·开源
不想看见40441 分钟前
C++/Qt 实习岗位深度解析【结合一次研发实习谈感受】
开发语言·c++·qt
王老师青少年编程1 小时前
信奥赛C++提高组csp-s之组合数学专题课:鸽巢原理详解及案例实践
c++·组合数学·信奥赛·抽屉原理·csp-s·提高组·鸽巢原理
sjmaysee1 小时前
Java框架SpringBoot(一)
java·开发语言·spring boot
寒秋花开曾相惜1 小时前
(学习笔记)3.8 指针运算(3.8.3 嵌套的数组& 3.8.4 定长数组)
java·开发语言·笔记·学习·算法
想唱rap1 小时前
Linux线程
java·linux·运维·服务器·开发语言·mysql
Tony Bai1 小时前
Rust 看了流泪,AI 看了沉默:扒开 Go 泛型最让你抓狂的“残疾”类型推断
开发语言·人工智能·后端·golang·rust
njidf2 小时前
C++与Qt图形开发
开发语言·c++·算法