Tag: c preprocessor

实现编译时机制检查字符串的唯一性

定义我的问题最简单的方法是我试图实现一种机制来检查是否已经使用了相同的字符串(或一对(数字,字符串))。 我希望使用C预处理器以智能方式实现此机制。 我还希望当调试模式中存在冲突或运行时错误时(通过检查断言),这种机制给了我编译错误。 我们不希望开发人员在添加消息时出错,因为每条消息都应该是唯一的。 我知道可以通过计算哈希值或例如crc / md5来完成,但这种机制可能是冲突易受攻击的,我需要避免。 每条消息只能使用一次至关重要。 此机制的示例行为: addMessage(1, “Message1”) //OK addMessage(2, “Message2”) //OK . . . addMessage(N, “MessageN”) //OK addMessage(2, “Message2”) //Compile error, Message2 has already been used 替代行为(调试代码时): addMessage(1, “Message1”) //OK addMessage(2, “Message2”) //OK . . . addMessage(N, “MessageN”) //OK addMessage(2, “Message2”) //Assertion failed, because Message2 has already been used 这样做的首选方法是智能使用#define和#undef指令。 一般来说,预处理器应该以智能的方式使用(我不确定这是否可行)也许它可以通过适当的宏组合来实现? […]

使用%s格式化时的#是什么

我遇到了这个断言的例子,并想知道#是什么: #define ASSERT( x ) if ( !( x ) ) { \ int *p = NULL; \ DBGPRINTF(“Assert failed: [%s]\r\n Halting.”, #x); \ *p=1; \ }

如何在跨文件预处理时获取唯一值

问题 我需要一种使用预处理器指令生成唯一值的方法。 目的是每次调用宏时,它将具有唯一的整数标识符。 但它应该保留它跨文件的价值。 有点像预处理器计数器,用于调用函数的次数。 更进一步的信息 我正在使用的宏是: #define LOG_MSG(a) log_msg(?) ‘a’是用户想要打印的字符串。 log_msg是一个用于在UART上打印消息的自定义函数 ‘?’ 如果我需要帮助的部分。 该宏仅在一个地方定义。 在预处理阶段,’?’ 将被唯一标识符替换。 我们这样做是为了减少字符串带来的开销,因为此代码将在嵌入式设备上运行。 在预处理之后,将提取标识符和相关字符串,并且将创建将映射它们的表(这将在应用程序侧)。 由于这将用于多个文件,我想要一种方法来为多个文件中的每次使用生成唯一标识符( 整数而不是字符串 )(每个唯一字符串的标识符将是理想的但不是必需的)。 有任何想法吗? 如果有任何遗漏或不完整的信息,请提及 笔记 __COUNTER__是我尝试的第一件事,但它并不适用于文件。 __FILE__会给我一个破坏目的的字符串。 有人提到使用唯一文件标识符。 但我不想静态分配这些。 我们正在使用CCS(它基于Eclipse Kepler构建)来构建此代码。 所以我想我们可以在构建系统中添加一些内容来执行@embedded_guy所提到的内容。 谁知道怎么做? 谢谢

检测C宏中是否存在参数

如何定义C宏IFARGS(YES, NO, …) ,以便调用没有附加参数的IFARGS会产生NO ,并且调用带有一个或多个参数的IFARGS会产生YES ? 我有一个使用GCC的答案(见下文),但如果可能的话,我更喜欢C99(或其不可能性的certificate)。

令牌贴在C中

看完VA_NARG后 我尝试使用宏根据C中的参数数量实现函数重载。 现在的问题是: void hello1(char *s) { … } void hello2(char *s, char *t) { … } // PP_NARG(…) macro returns number of arguments :ref to link above // does not work #define hello(…) hello ## PP_NARG(__VA_ARGS__) int main(void) { hello(“hi”); // call hello1(“hi”); hello(“foo”,”bar”); // call hello2(“foo”,”bar”); return 0; } 我从C-faq那里读到了这个 。 但仍然无法让它工作……

编译时大小有条件

如果涉及sizeof的条件为true,我想定义一个宏,如果它为false,则不执行任何操作(但仍然编译)。 如果预处理器支持sizeof ,它将如下所示: #if (sizeof(void*) <= sizeof(unsigned int)) // what goes here? # define POINTER_FITS_INTO_UINT #endif 有一些页面(例如http://scaryreasoner.wordpress.com/2009/02/28/checking-sizeof-at-compile-time/ )解释了如何在sizeof上进行编译时断言 (并且无法编译)如果它失败了),但我没有看到将这种方法扩展到我想要的方法。

用于计算存储数字n所需的位数的宏

假设我需要编写C宏来返回存储无符号32位整数所需的位数(1..32)。 (结果等于上限(log2(n))。 我需要它作为编译时计算宏,而不是函数。 我可以 #define NBITS(n) ((n)&(1<<31)?32:(n)&(1<<30)?31:… 它有效,但相当长。 (速度与此无关,计算在编译时)。 有没有更短的方法来编写这个宏? 最短的?

没有令牌字符串的cpp扩展宏

我正在阅读CPP宏扩展,并希望在未提供(可选)令牌字符串时理解扩展。 我发现gcc v4.8.4这样做: $ cat zz.c #define B (B) |B| $ gcc -E zz.c # 1 “zz.c” # 1 “” # 1 “” # 1 “zz.c” () | | 任何人都可以解释为什么扩展在一个实例中是零空间而在另一个实例中是一个?

用于生成带前缀的宏的宏function(避免字符串化)

背景 我有一个项目,我有两个单独的产品具有几乎相同的宏名称,为此我想创建一个类似宏的函数来快速检索宏的值。 我编写了一个getTranslation宏函数来获取提供给“函数”的文字文本,该函数应该被视为字符串和字符串前缀(如下所示)。 题 我如何完成获取提供给宏的参数,将它们连接在一起(中间带有下划线),并将该结果视为预处理器宏而不是字符串? 代码清单 /******************************************************************************* * coconut.h ******************************************************************************/ #define COCONUT (PRODUCT_COCONUT) #define COCONUT_FX_REGISTER (100) #define COCONUT_BASE_REGISTER (101) /******************************************************************************* * pineapple.h ******************************************************************************/ #define PINEAPPLE (PRODUCT_PINEAPPLE) #define PINEAPPLE_FX_REGISTER (200) #define PINEAPPLE_BASE_REGISTER (201) /******************************************************************************* * test.c. ******************************************************************************/ #include #include “translation.h” #include “coconut.h” int main(void) { int i = getTranslation(FX_REGISTER, COCONUT); printf(“Translation:%d.\n”, i); return 0; } /******************************************************************************* […]

_LINE__在内联函数中的行为

我有一个宏将行号和文件名传递给error handling程序: #define SYSTEM_FAILURE (error_code, comment) \ System_Failure((error_code), (comment), __LINE__, __FILE__); 在内联函数中使用时,如何解析__LINE__ ? file.h: inline int divide(int x, int y) { if (y == 0) { SYSTEM_FAILURE(ENUM_DIVIDE_BY_ZERO, “divide by zero error”); } return x/y; } __LINE__包含头文件中的行号,或者调用内联函数的源文件的行号(假设编译器在源代码中执行“粘贴”)?