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
相关产品推荐
相关产品推荐

