- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
只是工作中的一点好奇心,在这里。在处理一些危险的事情时,我开始考虑各种编译器的实现及其相关的标准库。这是我的想法的进展:
某些类别的标识符保留用于 C++ 和 C 中的实现。
编译器必须按顺序执行编译阶段(预处理、编译、链接)。
C 预处理器不知道标识符的保留状态。
因此,程序可以使用保留标识符当且仅当:
使用的保留标识符都是预处理器符号。
预处理结果不包含保留标识符。
标识符不与编译器预定义的符号冲突(GNUC
et. al.)
这有效吗?我不确定第 3 点和第 4.3 点。另外,有没有办法测试呢?
最佳答案
(对该问题的评论解释说,我们正在讨论 C99 第 7.1.3 节意义上的保留标识符,即匹配 /^_[A-Z_] 的标识符/
任何地方,/^_/
在文件范围内,/^str[a-z]/
带有外部链接,等等。所以这是我的猜测至少你问的一部分......)
在预期编译器(的任何特定阶段)诊断其误用的意义上,它们不是保留的。相反,它们是保留的,因为如果您愚蠢到自己(误)使用它们,那么如果您的程序停止工作或稍后停止编译,您就不会提示。
我们都已经看到,当只有危险的知识量的人查看系统 header 内部然后编写他们自己的 header 保护时会发生什么:
#ifndef _MYHEADER_H
#define _MYHEADER_H
// ...
#endif
他们正在调用未定义的行为,但没有人将此诊断为“错误:最终用户代码使用的保留标识符”。相反,他们大多很幸运,一切都很好;但偶尔它们会与实现感兴趣的标识符发生冲突,并且会发生令人困惑的事情。
同样,我经常有一个名为 strip()
左右的外部可见函数:
char *strip(char *s) {
// remove leading whitespace
}
根据我对 C99 的 7.1.3、7.26 和 7.26.11 的阅读,这会调用未定义的行为。但是我决定不关心这个。标识符不是保留的,因为今天预计会发生任何不好的事情,而是因为标准保留在未来修订中发明新标准 str-ip()
例程的权利。而且我已经决定我认为 string-ip
,无论它是什么,都不太可能在将来添加一个字符串操作的名称——所以在不太可能发生的事情,当我到达那座桥时,我会穿过那座桥。从技术上讲,我正在调用未定义的行为,但我不希望被咬。
最后,针对第 4 点的反例:
#include <string.h>
#define memcpy(d,s,n) (my_crazy_function((n), (s)))
void foo(char *a, char *b) {
memcpy(a, b, 5); // intends to invoke my_crazy_function
memmove(a, b, 5); // standard behaviour expected
}
这符合您的 4.1、4.2、4.3(如果我理解您对最后一个的意图)。但是,如果 memmove
被另外实现为一个宏(通过 7.1.4/1),它是根据 memcpy
编写的,那么您就会有麻烦了。
关于c++ - 保留标识符在编译的哪个阶段被保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3816345/
任何 Web、桌面或移动开发人员都经常使用图像。你可以从 C#、HTML、XAML、CSS、C++、VB、TypeScript 甚至代码注释中引用它们。有些图像是本地的,有些存在于线上或网络共享中
您是否曾经难以理解一个提交在做什么或者为什么要做?在审查或协作代码更改时,您是否希望有更多的清晰度和上下文?如果您的回答是肯定的,那么您会喜欢 GitHub Copilot 为您所做的——生成提交
Visual Studio 订阅(无论是专业版还是企业版)提供的不仅仅是软件使用权;这是一个全面的工具包,旨在显著提高您的开发能力和职业发展。这些订阅每年可以为您节省数千美元,提供各种服务,从每月
随着最近 Visual Studio 的资源管理器的改进,开发人员将得到一种全新的享受!我们非常激动地宣布重新设计的 Visual Studio 资源管理器,相信我们,它将改变游戏规则。 在
委托在现代代码中无处不在;委托是一种类型,它表示对具有特定参数列表和返回类型的方法的引用。开发人员使用委托将方法作为参数传递给其他方法。您可能熟悉的一个例子是事件处理程序。处理程序是可以通过委托调
来自Sergey Tepliakov的 https://sergeyteplyakov.github.io/Blog/csharp/2024/06/14/Custom_Task_Schedule
GitHub Copilot 是一个改变游戏规则的人工智能助手,可以彻底改变您在 Visual Studio 中的编码流程。在我们的视频系列中,Bruno Capuano 探讨了这个智
在17.10预览版2中,我们刚刚发布了预览支持,可以直接在 Visual Studio 的工作文件中查看 GitHub 和 Azure DevOps 的拉取请求注释。作为开发者社区中最受欢迎的 G
MSBuild 是 .NET 开发体验的基本组成部分,但它对新手和有经验的开发人员都具有挑战性。为了帮助开发人员更好地理解他们的项目文件,并访问需要直接编辑项目文件的高级功能,我们发布了一个实验性
通过使用代码覆盖率功能,您可以发现您的测试需要改进的地方,并使您的软件更加健壮和可靠。在这篇文章中,我们将介绍我们在 Visual Studio Enterprise 2022 中引入的 Code
GitHub Copilot 简介 GitHub Copilot 是一个新工具,可以帮助您在人工智能的帮助下更快,更智能地编写代码。它可以建议代码补全,生成代码片段,甚至为您编写整个函数。Git
序:最近看了一篇谷歌工程师总结自己十年来所学到的软技能,感觉说的很棒,特地翻译成中文,希望能分享给更多的人,原文内容非常多,计划分几篇翻译出来,个人的水平有限,感兴趣的朋友也可以进去看英文原文。原文地
本文为翻译 。 原文地址: 2023 State of Web Components: Today's standards and a glimpse into the future. 。
任何 Web、桌面或移动开发人员都经常使用图像。你可以从 C#、HTML、XAML、CSS、C++、TypeScript 甚至代码注释中引用它们。有些图像是本地的,有些存在于线上或网络共享中,而其
在 Visual Studio 2022 中,Web 开发人员的主要场景之一是使用 ASP.NET Core 创建 Web API。在 Visual Studio 2022 17.6 的最新预览
.NET 在数年前就在语言和库中添加了 async/await。在那段时间里,它像野火一样蔓延开来,不仅在 .NET 生态系统中,而且在无数其他语言和框架中被复制。在 .NET 中也看到了大量的
原文 | Stephen Toub 翻译 | 郑子铭 Mono 到目前为止,我一直提到 "JIT"、"GC "和 "运行时&quo
原文 | Stephen Toub 翻译 | 郑子铭 原始类型和数值 (Primitive Types and Numerics) 我们已经看过了代码生成和GC,线程和矢量化,互操
原文 | Stephen Toub 翻译 | 郑子铭 同样,为了不做不必要的工作,有一个相当常见的模式出现在string.Substring和span.Slice等方法中。
原文 | Stephen Toub 翻译 | 郑子铭 New APIs 在.NET 7中,Regex得到了几个新的方法,所有这些方法都能提高性能。新的API的简单性可能也误导了为实
我是一名优秀的程序员,十分优秀!