博客
关于我
《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/

你可能感兴趣的文章
Objective-C实现first come first served先到先得算法(附完整源码)
查看>>
Objective-C实现Gale-Shapley盖尔-沙普利算法(附完整源码)
查看>>
Objective-C实现getline函数功能(附完整源码)
查看>>
Objective-C实现greatest common divisor最大公约数算法(附完整源码)
查看>>
Objective-C实现greedy coin change贪心硬币找零算法(附完整源码)
查看>>
Objective-C实现hamiltonianCycle哈密尔顿图算法(附完整源码)
查看>>
Objective-C实现hamming code汉明码算法(附完整源码)
查看>>
Objective-C实现hamming numbers汉明数算法(附完整源码)
查看>>
Objective-C实现hammingDistance汉明距离算法(附完整源码)
查看>>
Objective-C实现hanning 窗(附完整源码)
查看>>
Objective-C实现hanoiTower汉诺塔算法(附完整源码)
查看>>
Objective-C实现hardy ramanujana定理算法(附完整源码)
查看>>
Objective-C实现harmonic series调和级数算法(附完整源码)
查看>>
Objective-C实现harris算法(附完整源码)
查看>>
Objective-C实现HashTable哈希表算法(附完整源码)
查看>>
Objective-C实现haversine distance斜距算法(附完整源码)
查看>>
Objective-C实现heap sort堆排序算法(附完整源码)
查看>>
Objective-C实现heaps algorithm堆算法(附完整源码)
查看>>
Objective-C实现heap堆算法(附完整源码)
查看>>
Objective-C实现Heap堆算法(附完整源码)
查看>>