Tag: 预处理器

如何避免来自C中#define的名称冲突? (或C ++)

这应该是一个非常基本的问题,我可以通过更改一些名称来避免这种情况,但我想也许我在这里缺少一些东西。 我为这个问题编写了一个最简单的代码。 conv.h : 1 struct convpar_ { 2 int K; 3 } convpar_; test.c : 1 #include 2 #include “conv.h” 3 4 #define K 7 5 6 typedef struct convpar_ convpar; 7 8 void func1(convpar cp) 9 { 10 printf(“cp.K = %d\n”, cp.K); 11 } 12 13 main() 14 { 15 convpar cp = […]

宏调用函数

我需要一个宏(或一个函数,但最好是一个宏),它接受一个函数名和无限数量的参数,然后将参数传递给函数。 我们假设这个宏是MACROFOO 。 #define MACROFOO(function, …) /* what do I put here?? */ int foo_bar(int x, int y) { // do stuff } int main(void) { int x = 3; int y = 5; MACROFOO(foo_bar, x, y); // calls foo_bar(x, y) } 我怎么能定义这样一个宏? 我想做的事情如下: #define MACROFOO(function, args…) (function)(args) 但看起来它传递给函数,而不是实际的参数。 我该怎么办?

预处理器宏将hex字符串转换为字节数组

我在我的IDE中定义了一个AES-128密钥作为构建符号,因此它像这样调用GCC: arm-none-eabi-gcc -D”AES_KEY=3B7116E69E222295163FF1CAA1681FAC” … (相当于#define AES_KEY 3B7116E69E222295163FF1CAA1681FAC ) 优点是相同的符号也可以作为参数自动传递给构建后的CLI脚本,该脚本使用此密钥加密编译的代码(例如,用于安全的固件更新)… 但是如何在代码中将此键存储为字节数组? 我想定义一个执行转换的预处理器宏: uint8_t aes_key[] = { SPLIT_MACRO(AES_KEY) }; 至 uint8_t aes_key[] = {0x3B, 0x71, 0x16, 0xE6, 0x9E, 0x22, 0x22, 0x95, …}; 换句话说,GCC预处理器是否可以在2-char块中拆分密钥字符串并在它们之间添加“ , 0x ”?

预处理器#if语句的工具/解析器?

我正在处理许多C源代码文件,其中包含许多预处理器#if , #if #elseif和#else语句。 这些语句通常会检查#define ,例如 #if(Switch_TestMode == Switch_TestModeON) /* code 1 */ #else /*code 2 */ #endif 这些预处理程序语句通常位于c-if语句中,这使得源代码几乎不可读。 用于此预处理程序#if语句的#define在额外文件中定义。 我现在的想法是有一个工具来检查这个#define d开关设置,然后只复制使用当前#define / switch设置应用的源代码行。 对于上面的示例,我想获得一个仅包含的新.c文件 /*code 2 */ 假设Switch_TestMode的#define不等于Switch_TestModeON 。 是否有工具(免费软件||低成本)可以完成这项工作? 或者我是否必须为此编写自己的预处理器解析器? (我不可能使用执行此工作的特殊参数来运行编译器,因为我们公司正在创建C源代码,另一家公司正在编译。) 谢谢你的提示! 问候 托马斯

CMake条件预处理器定义代码

我正在将一个makefile项目迁移到CMake。 第一次编写makefile的人已经完成了一个用于在include文件中写入某些值的模块。 有一个主config.h文件,其中包含config_in.h。 config.h文件包含以下内容: #ifndef USE_FEATURE_A #define USE_FEATURE_A 0 #endif #ifndef USE_FEATURE_B #define USE_FEATURE_B 0 #endif 在makefile中有一个假目标,如with_feature_a ,它在config_in.h中写入 #define USE_FEATURE_A 1 通过这种方式,有人可以打字 make with_feature_a make 获得正确的构建。 我想使用这个代码库但使用CMake来复制这样的东西。 我在网上尝试了几种方法,但我没有让它发挥作用。 set_target_properties(with_feature_a PROPERTIES COMPILE_DEFINITIONS “WITH_FEATURE_A=1” ) 这不起作用,因为如果我跑 make with_feature_a 我没有在预处理器命令行中看到with_feature_a 。 我做的第二次尝试是直接用内容集写一个文件到我想要的东西,但我不明白如何将file()命令连接到我的目标。 我把它放在我的CMakeLists.txt中 file(WRITE local/config_in.h “#define WITH_FEATURE_A 1” ) 但这并不是每次都执行,我不知道如何将其设置为单个目标。 任何帮助表示赞赏。 感谢您阅读所有这些内容。 对不起长话:) UPDATE 这里提供的解决方案是解决问题之路上的一大亮点。 问题是不允许递归定义。 我举了一个例子: 在CMakeLists.txt我放置: […]

有什么区别 – 1)预处理器,链接器,2)头文件,库? 我的理解是否正确?

好的,直到今天早上我才对这些术语感到困惑。 我想我有所不同,希望如此。 首先,令人困惑的是,由于预处理器已将头文件包含在包含函数的代码中,因此链接器链接到汇编器/编译器生成的目标文件的库函数是什么? 部分混淆主要是由于我对头文件和库之间的差异的无知而产生的。 经过一段谷歌搜索和堆栈溢出(就是术语?:p),我收集到头文件主要包含函数声明,而实际的实现是在另一个称为库的二进制文件中(我仍然不是100%确定这个)。 所以,假设在以下程序中: – #include int main() { printf(“whatever”); return 0; } 预处理器在代码中包含头文件的内容。 编译器/编译器+汇编器完成其工作,然后最终链接器将此目标文件与另一个实际存储了printf()工作方式的目标文件组合在一起。 我的理解是否正确? 我可能会离开……你能帮我吗? 编辑:我一直想知道C ++ STL。 它总是让我困惑的是它究竟是什么,所有这些标题的集合或什么? 在阅读完回复之后,我可以说STL是一个目标文件/类似于目标文件的东西吗? 而且,我想在哪里可以读取函数的函数定义,如pow() , sqrt()等等。我会打开头文件,但没有找到任何东西。 那么,库中的函数定义是否是二进制不可读的forms?

我可以使用C / C ++预处理器添加数字吗?

对于一些基地。 基数1甚至。 某种复杂的替代。 此外,当然,在现实生产代码中这样做并不是一个好主意。 我只是出于好奇而被问到。

是否有一个C预处理器根据定义/未定义的值消除#ifdef块?

原始问题 我想要的不是标准的C预处理器,而是可以从某处接受的变体 – 可能是命令行通过-DNAME1和-UNAME2选项 – 定义了哪些宏的规范,然后消除了死码。 通过一些例子可能更容易理解我所追求的内容: #ifdef NAME1 #define ALBUQUERQUE “ambidextrous” #else #define PHANTASMAGORIA “ghostly” #endif 如果命令是使用’-DNAME1’运行的,则输出将为: #define ALBUQUERQUE “ambidextrous” 如果命令是使用’-UNAME1’运行的,则输出将为: #define PHANTASMAGORIA “ghostly” 如果命令是在没有选项的情况下运行的,则输出将与输入相同。 这是一个简单的例子 – 我希望代码也可以处理更复杂的情况。 用现实世界但仍然简单的例子来说明: #ifdef USE_VOID #ifdef PLATFORM1 #define VOID void #else #undef VOID typedef void VOID; #endif /* PLATFORM1 */ typedef void * VOIDPTR; #else typedef mint VOID; […]