博客
关于我
《C Primer Plus中文版》第五版--学习记录3
阅读量:211 次
发布时间:2019-02-28

本文共 2488 字,大约阅读时间需要 8 分钟。

Mac OS 下的 GCC 编译问题及解决方案

1. 常见编译问题及解决方案

在 Mac OS 环境下,使用 GCC 编译时,可能会遇到一些常见问题。以下是一些常见问题及其解决方法:

1.1 链接错误

如果你在编译过程中遇到 ld: Undefined symbolsUndefined symbols for architecture x86_64 的错误,可能是因为缺少了必要的库文件。检查项目是否有依赖项,确保所有必要的库文件已经包含在编译命令中。

1.2 包含多个参数的格式化警告

print1.c 中,编译器会提示 %d 格式化符使用了多于数据的参数。例如:

printf("%d minus %d is %d\n", ten, 2, ten - two);

这里缺少了两个参数,导致警告。正确的格式化方式是:

printf("%d minus %d is %d\n", ten, 2, ten - 2);

1.3 浮点数格式化问题

showf_pt.c 中,使用 %f%e 格式化符时,可能会遇到类型不匹配的问题。例如:

printf("%f can be written %e\n", dip, dip);

这里的 diplong double 类型,而 %f%e 的默认类型是 double,因此需要使用 %Lf%Le 格式化符:

printf("%Lf can be written %Le\n", dip, dip);

1.4 类型大小获取错误

typesize.c 中,printf 函数使用 %u 格式化符来显示类型的大小。然而,sizeof 函数返回的值是 size_t 类型,而 %u 格式化符可以正确显示 size_t 的值。因此,不需要额外修改代码。

1.5 转义字符问题

escape.c 中,scanf 函数使用的格式化符 %fdouble 类型不匹配,应改为 %lf

scanf("%lf", &salary);

此外,printf 函数的格式化字符串中,$\b 组合会导致显示异常,建议使用 \n\t 结合。

2. 浮点数显示的最佳实践

showf_pt.c 中,正确的浮点数显示方式是使用特定的格式化符来显示不同精度的浮点数。例如:

float aboat = 32000.0; // 用 `%f` 格式化double abet = 2.14e9;  // 用 `%e` 格式化long double dip = 5.32e-5; // 用 `%Lf` 和 `%Le` 格式化

正确的代码示例:

int main(void) {    float aboat = 32000.0;    double abet = 2.14e9;    long double dip = 5.32e-5;    printf("%f can be written %e\n", aboat, aboat);    printf("%f can be written %e\n", abet, abet);    printf("%Lf can be written %Le\n", dip, dip);    return 0;}

编译并运行后,输出结果为:

32000.000000 can be written 3.200000e+041400000000.000000 can be written 1.400000e+090.000053 can be written 5.320000e-05

3. 可移植的整数类型名称

altnames.c 中,int16_t 是一个可移植的 16 位有符号整数类型。为了正确显示其值,可以使用 inttypes.h 中的宏定义:

#include 
int main(void) { int16_t me16 = 4593; printf("First, assume int16_t is short: me16 = %hd\n", me16); printf("Next, use a \"macro\" from inttypes.h: me16 = %" PRId16 "\n", me16); return 0;}

编译结果与预期一致,输出为:

First, assume int16_t is short: me16 = 4593Next, let's not make any assumptions. instead, use a "macro" from inttypes.h: me16 = 4593

4. 转义字符的正确使用

escape.c 中,scanf 函数应使用 %lf 格式化符读取浮点数:

int main(void) {    float salary;    printf("\aEnter your desired monthly salary: ");    printf(" $_______\b\b\b\b\b\b\b");    scanf("%lf", &salary);    printf("\n\t$%.2f a month is $%.2f a year.", salary, salary * 12.0);    printf("\rGee!\n");    return 0;}

编译并运行后,输出结果为:

Enter your desired monthly salary: 1234567.00$1234567.00 a month is $14814804.00 a year.Gee!

5. 总结

通过以上优化和修改,可以解决 Mac OS 环境下 GCC 编译的各种问题。关键在于正确使用格式化符,避免类型不匹配和参数数量不符的问题,同时熟悉可移植类型和转义字符的使用方法,可以显著提高代码的可读性和正确性。

转载地址:http://atzi.baihongyu.com/

你可能感兴趣的文章
PROFINET 模拟器使用教程
查看>>
Program type already present: android.support.v4.widget.EdgeEffectCompat
查看>>
PyTorch中文版官方教程来啦(附下载)
查看>>
Progress Kemp LoadMaster 远程命令执行漏洞复现(CVE-2024-1212)
查看>>
Project configuration is not up-to-date with pom.xml. Run Maven->Update Project
查看>>
Project Euler 15 Lattice paths
查看>>
Project Euler 48 Self powers( 大数求余 )
查看>>
Project Euler Problem 12: Highly divisible triangular number
查看>>
ProjectEuler 2
查看>>
projection介绍及EPSG:4326和EPSG:3857的投射转换
查看>>
project打开文件时,显示无法识别此文件格式?
查看>>
Prometheus + Grafana on Kubernetes部署
查看>>
prometheus + grafana进行服务器资源监控
查看>>
Prometheus Alertmanager 告警配置详解
查看>>
Prometheus Grafana 展示平台
查看>>
Prometheus pushgateway使用详解
查看>>
Prometheus 云原生 - Prometheus 数据模型、Metrics 指标类型、Exporter 相关
查看>>
Prometheus 云原生 - 基于 file_sd、http_sd 实现 Service Discovery
查看>>
Prometheus 云原生 - 微服务监控报警系统 (Promethus、Grafana、Node_Exporter)部署、简单使用
查看>>
Prometheus 云原生 - 监控 Linux、MySQL、Redis、RabbitMQ、Docker、SpringBoot 3.x
查看>>