c-preprocessor 相关问题

C和C ++计算机编程语言的宏预处理步骤。此标记还可用于有关源自或具有相同功能的其他编译器/语言的问题,例如Objective-C或C#中的#directives。

为指针结构创建一个宏

我需要创建一个宏来从函数参数类型转换(正确的词?)指针结构。这是我的结构: typedef 结构 _AppData { GtkWidget* 顶层; // 主窗口 GtkWidget* 视图; //

回答 2 投票 0

为什么使用预处理器#if语句而不是if() else?

我看到这种情况一直在进行,例如在 Linux 内核中。使用预处理器命令与普通 C++ if else 块相比的目的是什么?有速度优势什么的吗?

回答 4 投票 0

令牌串联运算符##的应用如何与禁止递归宏扩展相互作用?

标准规则 该标准对宏扩展的重新扫描阶段(#/## 处理和参数替换之后)进行了如下规定(C17 草案,6.10.3.4 ¶2): 如果...的名字

回答 1 投票 0

包含路径的字符串连接

有没有办法连接2个字符串文字以形成包含路径? 代码存根: #define INCLUDE_DIR "/include" #include INCLUDE_DIR“/dummy.h” 看看这个问题,答案指向

回答 4 投票 0

如果编译器是MSVC,是否有定义的预处理器定义?

所以我可以做类似的事情 #ifdef MSVC //这里做编译器特定的代码 #结束

回答 5 投票 0

Clang 和 MSVC 中不同的宏字符串化规则

我发现 MSVC 和 Clang 中的宏字符串化存在差异。是否可以在 Clang 中编写一个与 MSVC 中的字符串化作用相同的字符串化宏? #定义__IN_QUOT...

回答 2 投票 0

c++的C预处理器宏中的#和##是什么意思[重复]

我阅读了以下代码: #define MACRO(abc, def) {#def ## #abc} 字符结果[10] = MACRO(abc, def); 我知道 ## 运算符用于将两个字符串合并为一个,但是前面的 # 呢...

回答 2 投票 0

C++ 中可分配给类似函数的东西

我正在为一个在内部使用类似 Lisp 的数据结构(即 cons 单元)的东西编写代码。因此,将 cons 结构体的两个字段成员称为 x->car 和 x->cdr 是有意义的。 一个...

回答 1 投票 0

关于 PintOS 编译(C 编程)中的“预处理”,有 2 个引用头文件和不完整类型错误的问题

我是练习 PintOS 项目的学生。 在编程项目3(虚拟内存)中,我遇到了关于“编译中的预处理”(C程序)的问题。 我已经尝试了所有尽我所能的尝试,但是...

回答 1 投票 0

强制宏参数为字符串文字

在这里查看一些代码时,我看到一个宏,其中参数需要是字符串文字。 我发现了这个宏(来自 Jenn 的 Gustedt Modern C),它声称可以满足以下条件......

回答 1 投票 0

#pragma warning 禁用代码列表及其含义

禁用警告的语法如下: #pragma 警告禁用 414、3021 或者,更一般地表达: #pragma warning禁用[CSV数字代码列表] 有没有这些编号的列表...

回答 5 投票 0

使用 #ifdef 或 #if Defined() 查找变量已定义(未定义)的位置

我遇到一种情况,#ifdef 告诉我某些内容尚未定义,但它会像已定义一样继续编译一行。我不明白怎么会这样。 更广泛的背景是......

回答 4 投票 0

测试空宏定义

我在tracing.hh 中有一组调试宏。是否生成代码并输出是由真实源代码中的宏标志控制的: // 文件:foo.cc #定义跟踪0 #include“tracing.hh” /...

回答 3 投票 0

C 中类宏函数的语法

在网上,我读到要定义一个行为类似于函数的宏,语法是: #define foo(x,y) (栏((x),(y))) 但考虑到宏只是文本替换,为什么上面的语法...

回答 1 投票 0

如何使用预处理器将 C++ 中的参数与函数签名分开?

我正在使用C++预处理器批量生成函数定义,但是传递参数时出现问题 #包括 #定义 FOR_EACH_FUNC(_) \ _(int, add, int a, int b...

回答 2 投票 0

如何使用预处理器将C/C++中的参数与函数签名分开?

我正在使用C++预处理器批量生成函数定义,但是传递参数时出现问题 #包括 #定义 FOR_EACH_FUNC(_) \ _(int, add, int a, int b...

回答 2 投票 0

如何查看C预处理器输出?

在将 C 预处理器转换为目标文件之前,如何查看 C 预处理器生成的输出? 我想看看宏定义对我的代码做了什么。

回答 7 投票 0

为什么预处理器用单个空格替换注释而不是在C语言中删除它们[关闭]

我读到C语言中的注释在预处理时被替换为单个空格。规范中 该程序被分成由空格字符分隔的标记;评论是 重新...

回答 1 投票 0

计算 C 预处理器中两个代码位置之间的行数

我想使用 C 预处理器来计算两个代码位置之间的行数。基本思想是这样的: #定义开始__LINE__ 静态字符* string_list[] = { “一些str...

回答 3 投票 0

将数据放置在由常量算术表达式给出的地址处

上下文 我的团队将我们的项目从使用 Arm 编译器用于嵌入式 5 升级到嵌入式 6。在我们的代码中,我们将数据放置在 RAM 中的特定位置,如下所示: #定义 RAM_START_ADDR 背景 我的团队将我们的项目从使用 Arm 编译器用于嵌入式 5 升级到嵌入式 6。在我们的代码中,我们将数据放置在 RAM 中的特定位置,如下所示: #define RAM_START_ADDR <some constant> #define OFFSET <some other constant> ... volatile my_datatype_t __attribute__((at(RAM_START_ADDR + OFFSET))) var = ...; 但由于某种原因,Embedded 6 不再支持__attribute__((at(<addr>))),相反,我们需要使用__attribute__((section(".ARM.__at_<addr>")))。您可能已经注意到,我们正在处理的地址是一个算术表达式,__attribute__(section) 不支持该表达式,它需要一个数字字符串参数。 ARM 确实提供了一种解决方法,即 volatile my_datatype_t * const var = (volatile my_datatype_t *) (RAM_START_ADDR + OFFSET); 不同的是,当编译时,它不会为 var 分配空间,而是覆盖 RAM_START_ADDR + OFFSET 处的任何数据。还没有问 ARM 如何实现这一点,但我不相信除了他们已经提供的不起作用的解决方法之外我们还能得到任何东西。 问题 有没有办法在编译时计算常量算术表达式并将其格式化为字符串?如果是这样,那么我们仍然可以使用 __attribute__((section)) 并将数字字符串传递给它。 我做了很多研究,似乎没有一种方法可以定义宏,以便对表达式进行求值并且可以将值作为标记或字符串或任何其他内容进行访问。 你运气不好。这是一个预处理器,如果您想添加任何内容,则必须对所有可能的组合进行硬编码。这可以使用脚本生成,或者您可以尝试搜索像 boost 这样的现有项目。 // Add two numbers and output them in hex #define ADDHEX_1_1() 2 #define ADDHEX_1_2() 3 // .... few billion lines later #define ADDHEX_123_456() 234 #define CONCAT4(a, b, c, d) a##b##c##d #define XCONCAT4(a, b, c, d) CONCAT4(a, b, c, d) #define STRING(x) #x #define XSTRING(x) STRING(x) #define RAM_START_ADDR 123 #define OFFSET 456 #define AT XSTRING(XCONCAT4(ADDHEX_, RAM_START_ADDR, _, OFFSET)()) #include <stdio.h> int main() { puts(".ARM.__at_" AT); } 您可以使用 Boost 预处理器库来实现这一点:

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.