C和C ++计算机编程语言的宏预处理步骤。此标记还可用于有关源自或具有相同功能的其他编译器/语言的问题,例如Objective-C或C#中的#directives。
我正在为一个在内部使用类似 Lisp 的数据结构(即 cons 单元)的东西编写代码。因此,将 cons 结构体的两个字段成员称为 x->car 和 x->cdr 是有意义的。 一个...
关于 PintOS 编译(C 编程)中的“预处理”,有 2 个引用头文件和不完整类型错误的问题
我是练习 PintOS 项目的学生。 在编程项目3(虚拟内存)中,我遇到了关于“编译中的预处理”(C程序)的问题。 我已经尝试了所有尽我所能的尝试,但是...
在这里查看一些代码时,我看到一个宏,其中参数需要是字符串文字。 我发现了这个宏(来自 Jenn 的 Gustedt Modern C),它声称可以满足以下条件......
禁用警告的语法如下: #pragma 警告禁用 414、3021 或者,更一般地表达: #pragma warning禁用[CSV数字代码列表] 有没有这些编号的列表...
使用 #ifdef 或 #if Defined() 查找变量已定义(未定义)的位置
我遇到一种情况,#ifdef 告诉我某些内容尚未定义,但它会像已定义一样继续编译一行。我不明白怎么会这样。 更广泛的背景是......
我在tracing.hh 中有一组调试宏。是否生成代码并输出是由真实源代码中的宏标志控制的: // 文件:foo.cc #定义跟踪0 #include“tracing.hh” /...
在网上,我读到要定义一个行为类似于函数的宏,语法是: #define foo(x,y) (栏((x),(y))) 但考虑到宏只是文本替换,为什么上面的语法...
我正在使用C++预处理器批量生成函数定义,但是传递参数时出现问题 #包括 #定义 FOR_EACH_FUNC(_) \ _(int, add, int a, int b...
我正在使用C++预处理器批量生成函数定义,但是传递参数时出现问题 #包括 #定义 FOR_EACH_FUNC(_) \ _(int, add, int a, int b...
在将 C 预处理器转换为目标文件之前,如何查看 C 预处理器生成的输出? 我想看看宏定义对我的代码做了什么。
为什么预处理器用单个空格替换注释而不是在C语言中删除它们[关闭]
我读到C语言中的注释在预处理时被替换为单个空格。规范中 该程序被分成由空格字符分隔的标记;评论是 重新...
我想使用 C 预处理器来计算两个代码位置之间的行数。基本思想是这样的: #定义开始__LINE__ 静态字符* string_list[] = { “一些str...
上下文 我的团队将我们的项目从使用 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 预处理器库来实现这一点:
C 中#pragma 和 _Pragma() 有什么区别? 句法: #pragma 参数 和 _Pragma(arg) 我什么时候应该使用 _Pragma(arg)?
我在使用下面的宏时遇到的问题 // 假设定义了 __GNUC__ 或 __clang__。 #如果已定义(__has_c_attribute) #if __has_c_attribute(已弃用) #定义
GCC 预处理器宏和“#pragma GCC unroll”
是否有另一种机制可以让预处理器执行此操作: #定义限制 16 #pragma GCC 展开限制 对于 (size_t ii = 0; ii < LIMIT; ++ii) { ... That code hits an error: /path/to/my/file...
我需要在编译时进行一些简单的字符修改,例如而不是: char text[] = "测试文本"; 我希望能够写: char text[] = _MODIFY("测试文本&q...
我认为这个问题很清楚。我正在尝试编写一个编译器检测标头,以便能够在应用程序中包含有关使用哪个编译器以及哪个版本的信息。 这是一部分...
简单的问题,我在网上找不到答案。在可变参数宏中,如何查找参数的数量?如果 boost 预处理器有解决方案,我可以接受。 如果是的话...
在 C 宏中,应该更喜欢 do { ... } while(0,0) 而不是 do { ... } while(0) 吗?
一位客户最近对我雇主的 C 代码库进行了静态分析并向我们提供了结果。有用的补丁之一是请求将著名的 do { ... } while(0) 宏更改为 do { ... } ...