You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言宏与extern存储类练习报错:area未定义与头文件反斜杠警告

报错解决方法

错误1:头文件末尾反斜杠警告

原因

你定义AREA宏的最后一行续行符(反斜杠\)后没有任何有效代码,直接到文件末尾,属于无效的续行声明,因此触发编译器警告。

解决

删除AREA宏定义中最后一行语句末尾多余的反斜杠,仅需要续行的行末尾加反斜杠即可,宏结束的最后一行不需要加,修正后的宏定义如下:

#define AREA(a,b,polygone){\
            if((polygone == "square")||(polygone == "rectangle"))\
                area = a * b;\
            else if(polygone == "triangle")\
                area = a * b / 2;\
}

错误2:undefined reference to area/peri链接错误

原因

头文件中extern double area;、extern double peri只是全局变量声明,仅告知编译器这两个变量存在,没有实际分配内存空间。你没有在任何源文件中定义这两个全局变量,因此链接阶段找不到对应的符号。

解决

在任意源文件的全局作用域定义这两个变量,比如在areaperi.c的main函数外添加定义:

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

// 新增全局变量定义
double area, peri;

int main(){
    double Carea = AREA_C(3);
    double Cperi = PERI_C(3);
    printf("area: %.2lf\n", Carea);
    printf("peri: %.2lf\n", Cperi);
    AREA(2,2,"square");
    printf("%.2lf\n", area);

    return 0;
}

额外优化建议

你当前宏中使用==直接比较字符串的写法是错误的:C语言中==比较的是字符串的首地址而非内容,只有当比较的是同一个字面量时才会碰巧生效,其他场景会判断失败。建议改用strcmp函数比较字符串,需要先引入<string.h>头文件,将判断逻辑改为:

if((strcmp(polygone, "square") == 0)||(strcmp(polygone, "rectangle") == 0))

内容的提问来源于stack exchange,提问作者XxCharbonChainsxX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 17:36:03