MST

星途 面试题库

面试题:C语言自定义头文件中的复杂声明与作用域

在自定义头文件 `complex.h` 中定义一个结构体 `Complex` 表示复数,包含实部和虚部。同时定义一个函数 `Complex addComplex(Complex c1, Complex c2);` 用于复数加法。在主程序文件 `main.c` 中包含 `complex.h`,创建两个复数并调用 `addComplex` 函数进行加法运算并输出结果。此外,若 `complex.h` 中还定义了一个全局变量 `int flag;`,解释在 `main.c` 中对该变量的访问规则,以及如何避免头文件重复包含导致的问题。
28.3万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试

complex.h 文件内容

#ifndef COMPLEX_H
#define COMPLEX_H

// 定义复数结构体
typedef struct {
    double real;
    double imag;
} Complex;

// 复数加法函数声明
Complex addComplex(Complex c1, Complex c2);

// 全局变量声明
extern int flag;

#endif

main.c 文件内容

#include <stdio.h>
#include "complex.h"

// 定义全局变量,必须在某个源文件中定义一次
int flag = 0;

// 复数加法函数定义
Complex addComplex(Complex c1, Complex c2) {
    Complex result;
    result.real = c1.real + c2.real;
    result.imag = c1.imag + c2.imag;
    return result;
}

int main() {
    Complex c1 = {1.0, 2.0};
    Complex c2 = {3.0, 4.0};
    Complex sum = addComplex(c1, c2);

    printf("Sum: %.2f + %.2fi\n", sum.real, sum.imag);

    // 访问全局变量 flag
    printf("Flag value: %d\n", flag);

    return 0;
}

全局变量 flag 的访问规则

  1. complex.h 中使用 extern 关键字声明了 flag,这意味着它是在其他地方定义的全局变量。
  2. main.c 中,需要对 flag 进行定义(int flag = 0;),这样编译器才能为它分配内存空间。
  3. 任何包含 complex.h 的源文件都可以访问这个全局变量,但只能有一个源文件对其进行定义。

避免头文件重复包含的问题

  1. 使用 #ifndef#define#endif:在 complex.h 文件开头使用 #ifndef COMPLEX_H#define COMPLEX_H 和文件结尾使用 #endif,这样当同一个头文件被多次包含时,预处理器会忽略重复部分。
  2. #pragma once:部分编译器支持 #pragma once,在 complex.h 文件开头添加 #pragma once 也可以达到防止头文件重复包含的目的。但它不是标准 C 特性,兼容性可能不如 #ifndef 方式。