在 C 程序中使用 _ 和 __ [重复]

2023-12-02

我正在读K&R的书。我读:

...仅供标准库函数使用的名称 首先_所以它们不太可能与中的名称发生冲突 用户程序...

这到底是什么意思,请解释一下真正简单实用的方法。

我的理解是:

如果我想使用 math.h 中定义的 sqrt 那么

#include <math.h>
#define sqrt(x) x*x*x

main() 
{ 
int x=4; 
_sqrt(x); // That is from the header file math.h
sqrt(x); // my own defined macro 
/*or its the reverse way _sqrt for my own defined macro so it won't collide with original sqrt i.e. without _ for sqrt from math.h */ 
return 0;
}

现在,我在 stackoverflow 上阅读了一段代码,使用__。 sys/syscall.h 在 Windows 中不存在,所以我们必须使用

#if __linux 
#include <sys/syscall.h>
#elif defined(_WIN32) || defined(_WIN64)
#include <windows.h>
#endif

具体在哪里__使用过,黑白有什么区别__ & _.


这是什么C标准说(第 7.1.3 节):

  • 所有以下划线和大写字母或其他字母开头的标识符 下划线始终保留用于任何用途。
  • 所有以下划线开头的标识符始终保留用作标识符 文件范围位于普通名称空间和标记名称空间中。

(本节继续列出由某些标准标头保留的特定标识符和标识符集。)

这意味着,例如,实现(编译器或标准头)可以使用名称__FOO for 任何它喜欢的东西。如果您在自己的代码中定义该标识符,则程序的行为是未定义的。如果您“幸运”,您将使用一个没有定义它的实现,并且您的程序将按预期工作。

这意味着您根本不应该在自己的代码中定义任何此类标识符(除非您自己的代码是 C 实现的一部分 - 如果您必须询问,它不是)。无论如何,没有必要定义这样的标识符;几乎不缺少未保留的标识符。

您可以使用类似的标识符_foo只要它是在本地定义的(不在文件范围内)——但我个人发现完全避免使用前导下划线要容易得多。

顺便说一句,你的例子_sqrt并不一定能说明这一点。一个实现may定义名称_sqrt in <math.h>(因为任何定义的东西都在文件范围内),但没有特别的理由期望它会这样做。当我编译你的程序时,我收到警告:

c.c:7:1: warning: implicit declaration of function ‘_sqrt’ [-Wimplicit-function-declaration]

because <math.h>在我的系统上doesn't定义该标识符和链接时致命错误:

/tmp/cc1ixRmL.o: In function `main':
c.c:(.text+0x1a): undefined reference to `_sqrt'

因为图书馆里没有这样的符号。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 C 程序中使用 _ 和 __ [重复] 的相关文章

随机推荐

  • 为什么MKMapView中的clusterAnnotationForMemberAnnotations没有被调用?

    我有一个简单的地图视图 IBOutlet private var mapView MKMapView 然后我一一添加注释 mapView addAnnotation Annotation user user 并向他们展示全部 mapView
  • 如何获取GPU信息?

    我有一个任务是用 C 收集有关 Windows 中 GPU 的信息 但我不知道从哪里开始 任何想法 更新 我想要名称 vram dac 制造商 版本 时钟 update2 如果我使用 win32 videocontroller 类 我只是获
  • 如何在 Python 中多次训练 sklearn 中的 SVM 分类器?

    我想知道是否可以在 for 循环中多次从 Python 中的 sklearn 训练 SVM 分类器 我的想法如下 for i in range 0 10 data np load somedata labels np load somela
  • android webview 导致空指针

    我的布局中有这个
  • Qt 创建者错误

    启动项目调试 然后 Running build steps for project Text Editor Starting c qt 2010 05 qt bin qmake exe C Qt 2010 05 Text Editor Te
  • iOS 8.3 中的 UIDatePicker 内存泄漏

    当在运行 IOS 8 3 的 iPad 上的弹出窗口中使用 UIDatePicker 时 我发现内存泄漏 每次弹出日期选择器然后关闭时 我都会在多次内存泄漏中得到大约 5K 的信息 泄漏的对象是 NSDateComponents 负责的框架
  • Boost:反序列化通过 ZeroMQ 拉套接字传递的自定义 C++ 对象

    我在这里写的文字是我之前在另一个线程中打开的后续问题Boost 序列化 反序列化通过 ZeroMQ 拉套接字传递的自定义 C 对象 早期线程中的编译问题已通过使用文本存档类型而不是二进制存档解决 但现在我在反序列化时遇到运行时问题 为了您的
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 如何在打字稿中使用 jquery ui 和 commonjs

    为了获得更多上下文 我决定将所有模块保留为 commonjs 格式以实现可移植性 并使用 browserify 和其他一些东西来捆绑前端的东西 我使用 TypeScript 进行类型检查 但我不确定如何在我的配置中使用 jquery ui
  • 如何创建随机 3D 矩阵?

    有没有办法随机创建 3D 矩阵 有多种方法可以使用以下方法创建随机二维矩阵randint功能 有没有类似的内置功能 例如 使用以下命令可以轻松生成 4x4 矩阵randint功能 如果我想创建一个 4x4x3 维度的矩阵怎么办 您可以使用r
  • Struts逻辑:迭代输入字段

    我目前有以下代码 数据显示良好
  • PHP strtotime 对于小于 1900 的日期返回 false

    我知道这个问题很受欢迎 在这里问PHP strtotime 对于未来的日期返回 false 和这里如何在 PHP 中处理 1900 年之前的日期 您能否确认我的选择 升级到64位架构 将 strtotime 调用替换为 DateTime D
  • 如何在WinForms系统菜单中显示带有图标和文本的菜单项

    在调整的同时answer of ygoe 我发现可以向菜单添加图标 我尝试并成功地通过将此代码用于纯文本项目来做到这一点 var item new MenuItemInfo cbSize uint Marshal SizeOf typeof
  • HTML textarea:使用 JavaScript 获取换行文本?

    如果我有一个像这样的文本区域
  • 只读取txt文件中给定的最后x行[重复]

    这个问题在这里已经有答案了 目前我正在使用 File ReadAllText 读取文件内容 但现在我需要读取 txt 文件中的最后 x 行 我怎样才能做到这一点 内容myfile txt line1content line2content
  • 如何在 tensorflow.js 模型中添加图像并针对给定图像标签训练模型

    我们使用 TensorFlow js 来创建和训练模型 我们使用 tf fromPixels 函数将图像转换为张量 我们想要创建一个具有以下属性的自定义模型 AddImage HTML Image Element Label 添加带有自定义
  • JqG​​rid addJSONData + ASP.NET 2.0 WS

    我有点失落 我尝试实现一个基于 JqGrid 的解决方案 并尝试使用函数作为数据类型 我猜我已经按照书本设置了所有内容 我调用了 WS 并返回了 JSON 我在 ajax 调用中在客户端取得了成功 并且我使用 绑定 jqGridaddJSO
  • 发送 AJAX 结果但继续在 PHP 中处理

    我正在使用 AJAX 更新数据库中的一些值 一切都工作得很好 但现在我想实现一些日志记录的东西 日志记录功能看起来需要花费相当多的处理时间 并且用户没有理由必须等待它们完成才能看到 AJAX 结果 因此 我正在尝试找到一种方法来发送 AJA
  • 如何在Java中读取同一行的多个输入?

    因此 我尝试使用扫描仪读取一行中的所有输入 然后获取值并找到第二大值 我会使用一个数组BUT我不被允许 您应该输入 10 个整数 按 Enter 键并计算它们 像这样的事情 10 20 30 40 50 60 70 80 90 100 EN
  • 在 C 程序中使用 _ 和 __ [重复]

    这个问题在这里已经有答案了 我正在读K R的书 我读 仅供标准库函数使用的名称 首先 所以它们不太可能与中的名称发生冲突 用户程序 这到底是什么意思 请解释一下真正简单实用的方法 我的理解是 如果我想使用 math h 中定义的 sqrt