gpt4 book ai didi

你能设计一个简单的宏来在使用时有效地产生编译器错误吗?

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

我正在寻找一个奇怪的宏定义,目的是:我需要一个以这种方式定义的宏,如果宏在编译代码中有效使用,编译器将始终产生错误。

背景:由于C11引入了几个新的关键字,新的C++11标准也增加了几个,所以我想在我的项目中引入一个头文件(主要使用C89/C95编译器并添加一些)强制开发人员避免使用这些新关键字作为标识符名称,当然,除非它们以预期的方式被识别为关键字。

在过去,我为 new 这样做是这样的:

#define new *** /* C++ keyword, do not use */

是的,它奏效了。直到它没有出现,当程序员忘记参数名称中的下划线时:

void myfunction(uint16_t new parameter);

从那以后我就使用了变体,但我再也没有受到过挑战。

现在我打算创建一个包含各种编译器不支持的所有关键字的文件,并且我正在寻找一个可靠的解决方案,最好不要有太困惑的错误消息。 “语法错误”没问题,但“参数丢失”已经很困惑了。
我在想

#define atomic +*=*+ /* C11 derived keyword; do not use */

除了我通常的犹豫之外,我非常确定宏的任何使用(但不是定义)都会产生错误。

编辑:为了让它变得更加困难,MISRA 将只允许使用基本的源代码和执行字符集,所以 @$ 是不允许的。

但是我想问问社区:你们有更好的宏观值(value)吗?一样有效,但时间更短?或者在某些奇怪的情况下甚至更长但更可靠?或者当出于任何目的使用“不鼓励的”标识符时,使用完全不同的方法来生成错误(请仅使用编译器,而不是外部工具!)?

免责声明:而且,是的,我知道我可以使用 grep 或解析器在夜间构建中运行,并报告它发现的警告。但是在开发人员桌面上直接删除错误会更快,并且肯定会在 checkin 之前修复。

最佳答案

如果运动是针对总是产生错误的最短标记序列,则两个 1 字符运算符的任意组合不能合法地同时出现,但是

  • 不要使用({})因为 gcc 对此有特殊的意义
  • 不要使用任何类型的不平衡括号,因为在识别出错误之前,它们会使您走得很远
  • 不要使用<>因为它们可以匹配 C++ 的模板参数
  • 不要将前缀运算符用作第二个字符
  • 不要使用后缀运算符作为第一个字符

这留下了一些可能性

  • .. , .|和其他与 . 的组合自 .需要以下标识符
  • &| , &/ , &^ , &, , &;
  • !| , !/ , !^ , !, , !;

但实际上为了更加用户友好,我也会首先放置一个 _Pragma在其中,因此编译器也会发出警告。

#define atomic _Pragma("message \"some instructive text that you should read\"") ..

关于你能设计一个简单的宏来在使用时有效地产生编译器错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9006358/

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