Tag: c preprocessor

C中只有一次伪通用标头

在对通用向量进行了一些工作后,我询问了这个问题 ,我想知道是否有任何方法可以检查每个类型的库的每个实例只进行一次。 这是当前头文件的样子: #ifndef VECTOR_GENERIC_MACROS #define VECTOR_GENERIC_MACROS #ifndef TOKENPASTE #define TOKENPASTE(a, b) a ## b #endif #define vector_t(T) TOKENPASTE(vector_t_, T) #define vector_at(T) TOKENPASTE(*vector_at_, T) #define vector_init(T) TOKENPASTE(vector_init_, T) #define vector_destroy(T) TOKENPASTE(vector_destroy_, T) #define vector_new(T) TOKENPASTE(vector_new_, T) #define vector_delete(T) TOKENPASTE(vector_delete_, T) #define vector_push_back(T) TOKENPASTE(vector_push_back_, T) #define vector_pop_back(T) TOKENPASTE(vector_pop_back_, T) #define vector_resize(T) TOKENPASTE(vector_resize_, T) #define vector_reserve(T) TOKENPASTE(vector_reserve_, […]

大多数嵌入式C编译器如何定义内存映射I / O的符号?

我经常写这样的内存映射I / O引脚 P3OUT |= BIT1; 我以为我的预处理器正在用这样的东西替换P3OUT: *((unsigned short *) 0x0222u) 但我今天挖了一个H文件,看到了这些内容: volatile unsigned short P3OUT @ 0x0222u; 在此之前还有一些扩展,但通常是这样。 正在使用符号’@’。 除此之外,还有一些关于使用扩展的C语言集的#pragma。 我假设这是链接器的某种指令,并且有效地将符号定义为存储器映射中的该位置。 我的假设是否适合大多数编译器的大部分时间? 这种方式或其他方面有关系吗? 那个@符号来自哪里,它是某种标准吗? 我正在使用IAR Embedded工作台。 这个问题类似于这个问题: 如何将变量放在内存中的给定绝对地址(使用GCC) 。 它符合我认为编译器正在做的事情。

使用gcc编译C时,预处理的.i文件中的数字含义是什么?

我想了解编译过程。 我们可以使用以下命令查看预处理器中间文件: gcc -E hello.c -o hello.i 要么 cpp hello.c > hello.i 我大致知道预处理器的作用,但我很难理解某些行中的数字。 例如: # 1 “/usr/include/stdc-predef.h” 1 3 4 # 1 “” 2 # 1 “hello.c” # 1 “/usr/include/stdio.h” 1 3 4 # 27 “/usr/include/stdio.h” 3 4 # 1 “/usr/include/features.h” 1 3 4 # 374 “/usr/include/features.h” 3 4 这些数字可以帮助调试器显示行号。 所以我对第一列的猜测是第2列文件的行号。 但是以下数字有什么作用?

以下C代码有什么问题?

可能重复: 对C宏扩展和整数运算感到困惑 一个谜语(在C中) 以下C程序的预期输出是打印数组中的元素。 但是当实际运行时,它不会这样做。 #include #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() { int d; for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) printf("%d\n",array[d+1]); return 0; }

如何将变量参数Functioncall作为宏定义?

想象一下,我有一个调试源文件,如下所示: #if _OWN_DEBUG_LEVEL != 0 void DebugLogMsg (DebugStruct_t *DebugStruct, size_t sizeID, char const *szFormat, …); #else #define DebugLogMsg(_Expression1, _Expression2, _Expression3) ((void)0) #endif 在这种情况下,我并不真正关心函数的其他参数,但是这个案例呢? #if _OWN_DEBUG_LEVEL > 0 #undef DebugLogMsg1 #define DebugLogMsg1(_Expression1, _Expression2, _Expression3) \ DebugLogMsg(_Expression1, _Expression2, _Expression3) #endif 在这种情况下,我不太确定…当我像这样调用宏时: DebugLogMsg1(pointer, var, pointer, 1, 2, 3); 将_Expression3视为pointer, 1, 2, 3或什么是确切的行为?

我们可以在很多行中编写宏而不用反斜杠吗?

我在CPP手册中看到了一些例子,我们可以在没有反斜杠的情况下在多行中编写宏体。 #define strange(file) fprintf (file, “%s %d”, … strange(stderr) p, 35) 输出: fprintf (stderr, “%s %d”, p, 35) 它们是特殊情况,如参数宏中的指令还是只允许#define? 对于include指令如果我没有错,它必须总是在一行上声明。 编辑: 来自https://gcc.gnu.org/onlinedocs/cpp/Directives-Within-Macro-Arguments.html 3.9宏观论证中的指令 有时,在宏的参数中使用预处理程序指令很方便 。 C和C ++标准声明在这些情况下的行为是未定义的。 GNU CPP处理宏参数中的任意指令的方式与处理指令的方式完全相同,类似函数的宏调用不存在。 如果在宏调用中重新定义了该宏,则新定义会在参数预扩展时及时生效,但原始定义仍用于参数替换。 这是一个病态的例子: #define f(x) xx f (1 #undef f #define f 2 f) 扩展到 1 2 1 2 用上面描述的语义。 这个例子很多。

预处理器:在令牌之前缺少二元运算符

我正在尝试在XMEGA微控制器中设置USART模块,并偶然发现我找不到的错误。 为清楚起见,我给你完整的代码。 因此,此头文件中没有任何内容丢失。 ( F_CPU在主文件中定义) #ifndef USART_H_ #define USART_H_ #include #define USART_BAUDRATE 4800 #define USART_BSCALE -3 #if USART_BSCALE < 0 #define USART_BSEL F_CPU / (pow(2,USART_BSCALE) * 16 * USART_BAUDRATE) – 1 #define USART_BAUD_REAL F_CPU / (pow(2,USART_BSCALE) * 16 * (USART_BSEL + 1)) #else #define USART_BSEL (1 / (pow(2,USART_BSCALE))) * (F_CPU / (16 * USART_BAUDRATE) – […]

C ++预处理器 – 连接参数

有没有办法使用加入者令牌使C ++预处理器连接参数? 我了解到我能做到: #include #define arg1 foo #define arg2 bar #define arg3 baz BOOST_PP_SEQ_CAT((arg1)(_)(arg2)(_)(arg3)) 得到foo_bar_baz 。 我有两个问题: 有没有一种方法可以在没有重复显式连接符( (_) )和可变长度的参数列表的情况下执行此操作? 是否有必要像这样传递参数: (arg1)(arg2)(arg3) 我可以将它包装在另一个允许我正常传递参数的宏中,即?: arg1, arg2, arg3

如何将预处理器(宏)类型转换为输出int

我有一个非常简单的宏,我想将其输出类型转换为int 。 怎么做? #define Numbits(A) (sizeof(A)*CHAR_BIT) 我试过了: #define int Numbits(A)({int val; val = sizeof(A)*CHAR_BIT; return val;}) 但它也行不通

C预处理器宏 – 基于参数连接的条件

我需要有关宏的帮助! 假设我已经定义了以下常量 #define foo_tacos_tuesday 1 #define foo_tacos 1 #define foo_nachos_wednesday 2 #define foo_nachos 3 我想编写一个执行以下操作的宏 #define MyFancyMacro( arg1, arg2 ) \ #if ( foo_ ## arg1 ## _ ## arg2 != foo_ ## arg1 ) \ foo_ ## arg1 ## _ ## arg2, foo_ ## arg1, 所以我可以设置一个只映射不匹配值的映射表: static const int mappingTable[] = { MyFancyMacro(tacos, tuesday) […]