- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想广泛使用##-operator和enum魔术来处理大量类似的访问操作,错误处理和数据流。
如果应用##
和#
预处理程序运算符导致无效的pp token ,则该行为在C中未定义。
通常,在C90中未定义(*)预处理器操作的顺序(请参阅The token pasting operator)。现在,在某些情况下(在包括MISRA委员会在内的不同来源以及所引用的页面中这样说)中,多个## /#-运算符的顺序会影响未定义行为的发生。但是,我很难理解这些来源的示例并确定通用规则。
所以我的问题是:
#define test(A) test_## A ## _THING
int test(0001) = 2;
最佳答案
有效pp token 的规则是什么?
这些在各自的标准中有详细说明; C11§6.4和C++ 11§2.4。在这两种情况下,它们都对应于生产预处理 token 。除了pp-number之外,它们也不足为奇。其余的可能性包括标识符(包括关键字),“标点符号”(在C++中,pre-processing-op-or-punc),字符串和字符文字,以及任何与任何其他乘积都不匹配的非空白字符。
除少数异常(exception),任何字符序列都可以分解为有效的预处理 token 序列。 (一个异常(exception)是引号和撇号不匹配:单引号或撇号不是有效的预处理 token ,因此包含未终止字符串或字符文字的文本不能被标记化。)
但是,在##
运算符的上下文中,串联的结果必须是单个预处理 token 。因此,无效串联是一种串联,其结果是包含多个预处理 token 的字符序列。
C和C++之间有区别吗?
是的,有一些细微的差异:
::
,.*
和->*
,所有这些符号在C中都将被标记为两个标点符号。此外,在C++中,一些看起来像关键字的东西(例如new
,delete
)是预处理操作的一部分-punc(尽管这些符号在两种语言中都是有效的预处理 token 。)1.1p-3
),这在C++中不是有效的预处理 token 。 1'000'000'000
)。在C语言中,这可能会导致不匹配的撇号。 \u0234
)的处理上存在细微差异。 <::
或<
,否则::
将被标记为:
,>
。 (通常使用最长匹配规则对<:::
和<::>
进行标记。)在C语言中,最长匹配规则没有异常(exception); <::
始终使用最长匹配规则进行 token 化,因此第一个 token 始终为<:
。 test_
,
0001
和
_THING
是否合法?
test_ ## 0001 => test_0001 (identifier)
test_0001 ## _THING => test_0001_THING (identifier)
0001 ## _THING => 0001_THING (pp-number)
test_ ## 0001_THING => test_0001_THING (identifier)
#define concat3(a, b, c) a ## b ## c
concat3(., ., .)
..
是
...
也不是 token 。但是连接必须以某种顺序进行,并且
..
将是必要的中间值。由于这不是单个标记,因此串联将无效。
concat3(27,e,-7)
-7
是两个标记,因此无法串联。
concat3(27e, -, 7)
27e- ## 7
,它是两个pp-number的串联。但是
-
不能与
7
并置,因为
-7
不是单个标记。
.
)开头,后跟一个十进制数字。 +
,-
)。两种语言的指数符号可以是E
或e
;从C99开始,还使用C语言编写了P
和p
。 letter
包含下划线。同样,可以使用通用字符名称(C++中的撇号除外)。 关于c++ - 有效和无效的pp token 的定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31320515/
所以我想弄清楚指针,我读了一些关于指针指针的帖子,但我仍然无法弄清楚为什么这个程序可以顺利运行 #include #include int main(){ char* p = "abc";
我正在尝试使用“滴答时间”来跟踪我的 PNaCl 游戏中的时间,因为游戏时间不应受到用户调整其系统时钟的影响。 我想同时使用 pp::Core::GetTimeTicks()和 pp::InputEv
我是 django 和 python 的新手,我试图在一段 django 代码上运行服务器,但我遇到了以下问题, Kinnovates-MacBook-Pro:platformsite Kinnova
在 C++ 中,如果: int a = 3; int* p = &a; 那是为什么 const int* &pp = p; 不允许,但是 const int* const &pp = p; 允许吗?
OUnit framework有一个功能assert_equal哪个可以(除其他外)进行论证 pp_diff以更易读的方式格式化两个输入的差异。由于数据结构在现实世界的应用程序中变得相当大,这似乎非常
我尝试使用 SQL 查询获取数量,但它不起作用; string selectrow; int rowindex = dataGridView1.CurrentCell.Row
我想传递一个具有不同数量列名的数组和表来查询数据库。 public function get_list() { $list = func_get_args(); $table = ar
规范在 2.5 列出了 pp token 的类别,但包含最后一个类别 each non-white-space character that cannot be one of the above 我很
百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 预测部署简介与总览 百度飞桨(PaddlePaddle) - PP-OCRv3 文字检测识别系统 Paddle Infer
Paddle Inference 模型推理流程 分别介绍文字检测、方向分类器和文字识别3个模型,基于Paddle Inference的推理过程。 Paddle Inference 的
我正在尝试为某些节点在我的某些模块上设置顺序。 node basenode{ include ps include netfx include hg include reportviewer2
我正在用 Ruby 解析一个 JSON 文件,并希望使用 pp 将结果输出到一个文件中。我该怎么做?这是我正在尝试的代码: require 'rubygems' require 'json' requ
我有一个非常奇怪的问题,但只有在运行 Ubuntu 时才会出现(在 CentOS 上一切正常)。我用 Perl 编写了一个脚本并使用了 Mail::IMAPClient模块。 当我运行以下命令时: p
使用 REST API,如果我将用户发送到 PayPal 以收集送货信息(当然还要付款),我该如何收取税费或运费? 做一些研究,这似乎几乎是不可能的,但我无法想象情况会是这样。如果我必须自己收集运输信
哪种范式更适合算法的设计和分析?哪个更快?因为我在大学有一门类(class)叫算法设计与分析,而且有时间限制。 OOP 比过程编程慢吗?还是时差不大? 最佳答案 面向对象编程与算法不是特别相关。您将需
我有一个递归对象 (Cucumber::Rails::World.scenario),我想检查它(以便找到属于当前场景的标签)。 scenario.inspect 永远不会完成,并且 pp scena
我确实做了一些搜索,但找不到简单问题的答案。 Ruby 中的 p 和 pp 有什么区别?我知道您需要 require 'pp'。除此之外还有哪些区别? 最佳答案 p 用于作为调试助手检查变量。它可以打
这是我试图解决提出的无关问题的尝试 "Why don’t my system calls work in the Perl program I wrap with pp?"我在 linux 系统上创建
目录 Paddle Serving服务化部署实战 准备预测数据和部署环境 环境准备 安装 PaddlePaddle 2
我在一篇论文中引用了哈佛风格,我想稍微修改一下文本引用的输出方式。我正在使用 Biblatex,并且我使用了一些规范来制作符合哈佛引用文献的文内引用和引用书目,所以这一切都很好。 然而,文内引用看起来
我是一名优秀的程序员,十分优秀!