gpt4 book ai didi

c - 为什么我们需要功能测试宏?

转载 作者:行者123 更新时间:2023-12-04 12:13:55 26 4
gpt4 key购买 nike

通过阅读 What does -D_XOPEN_SOURCE do/mean? ,我了解如何使用功能测试宏。
但是我仍然不明白为什么我们需要它,我的意思是,我们可以启用所有可用功能吗?然后doc是这样写的:这个功能只在Mac/BSD下可用,那个功能只在Linux下可用,如果你使用它,那么你的程序只能在那个系统上运行。
那么为什么我们首先需要一个功能测试宏呢?

最佳答案

why do we need it, I mean, can we just enable all features available?


想象一下,某家公司编写了完美的 super 可移植代码,大致如下所示:
#include <stdlib.h>
struct someone_s { char name[20]; };

/// @brief grants Plant To someone
int grantpt(int plant_no, struct someone_s someone) {
// some super plant granting algorithm here
return 0;
}

int main() {
// some program here
struct someone_s kamil = { "Kamil" };
return grantpt(20, kamil);
}
该程序完全正常并且一切正常,并且该程序与 C 非常兼容,因此应该可以移植到任何地方。现在想象一下 _XOPEN_SOURCE不存在!客户收到该程序的源代码,并尝试在他的尖端 Unix 计算机上编译并运行它,并在经过认证的 POSIX 系统上使用经过认证的 C 编译器,但他收到了该公司必须修复的错误,并且必须支付以下费用:
/tmp/1.c:7:9: error: conflicting types for ‘grantpt’; have ‘int(struct someone_s,  int)’
7 | int grantpt(struct someone_s someone, int plant_no) {
| ^~~~~~~
In file included from /tmp/1.c:2:
/usr/include/stdlib.h:977:12: note: previous declaration of ‘grantpt’ with type ‘int(int)’
977 | extern int grantpt (int __fd) __THROW;
| ^~~~~~~
看起来在 POSIX 中已经为函数选择了一个完全随机的名称 - grantpt() .
引入不在 reserved space, 中的新符号时像 POSIX 这样的标准不能只是“添加它们”并期望世界不要抗议 - 冲突的定义可以并且将会并且确实会破坏有效的程序。与问题作斗争 feature_test_macros被介绍。当程序执行时 #define _XOPEN_SOURCE 500这意味着它是为 POSIX 标准准备的,并且该版本中 POSIX 引入的代码和符号之间没有冲突。
功能测试宏不仅仅是“我的程序想要使用这些功能”,最重要的是“我的程序与这些功能没有冲突”,这更重要,以便现有程序继续运行。

关于c - 为什么我们需要功能测试宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68259832/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com