Articles of c preprocessor

将“getter”函数replace为macros查找

问题 我试图通过大型平台抽象库(PAL)将多个基于硬件的产品移植到资源有限(即千字节计数 )的小型embedded式系统中。 目前的PAL有一个简单的getRegister()函数,它返回一个特定产品的寄存器地址。 例如,假设产品名为coconut和pineapple ,代码将如下所示: #include "headers/Include/coconut.h" #include "headers/Include/pineapple.h" enum prodType { PROD_COCONUT = 0, PROD_PINEAPPLE, PROD_MAX, PROD_INVALID = (-1) }; uint64_t getRegister(enum prodType prod, int regName) { uint64_t r = 0; switch (prodType) { case PROD_COCONUT: switch (regName) { case REG_BASE: r = COCONUT_REG_BASE; break; case REG_CORE: r= COCONUT_REG_CORE; break; } break; case […]

我可以在预处理器和编译器之间挤压我自己的程序吗?

这是一个愚蠢的问题,或者我可以指定g ++来使用预处理器和编译器之间的程序? 另外,我知道我可以在一个文件(因此所有的文件)上运行预处理器。 然后我猜测有一个开关只运行编译器。 所以我可以手动调用这两个,并把我的程序之间。 如果是这样,我该如何运行编译器(和链接器?)? 我宁愿第一种方法,因为我们的build设者可能不会同意我:)。

从GCC获取预定义的macros,没有临时文件

有没有办法从GCC预处理器检索预定义的macros, 而不必使用临时文件 (例如使用pipe道)? 这里有一个类似的问题在StackOverflow,但所有的答案都使用命令行,而我需要从一个进程内读取提到的数据。 GCC转储预处理器定义 谷歌基本上返回了很多问题的命令行版本的答案。 当我尝试使用pipe道执行将输出引导到Linux上的/ dev / null或Windows上的NUL的命令行技巧时: RunAndGetOutput("cpp -dM -E < NUL"); 发生错误: cpp.exe:错误:<:无效的参数 cpp.exe:警告:'-xc'最后的input文件没有任何作用 cpp.exe:致命错误:没有input文件 编译终止。 当我从命令行执行相同的命令时,一切正常,并且定义它打印的列表。 有什么办法可以解决这个问题吗?

如何获得单独的头文件的预处理输出?

我有一个头文件,在我使用像: #if defined(LINUX) || defined(ANDROID) pthread_t gpthread; #endif 现在,我想在编译过程中传递-DLINUX之后只获取头文件内容。 有没有办法得到它? 如果我使用: #arm-linux-androideabi-g++ -E main.c > temp 那么输出对我来说有点混乱。

有没有办法从string中获取evdev键码?

我想阅读包含如下数据的文本文件中的button映射: DPAD_LEFT = 105 DPAD_RIGHT = 106 DPAD_UP = 103 DPAD_DOWN = 108 右边部分实际上是evdev键码(在<linux/input.h>定义)。 这是很难看,所以我想能够有这样的文件: DPAD_LEFT = KEY_LEFT DPAD_RIGHT = KEY_RIGHT DPAD_UP = KEY_UP DPAD_DOWN = KEY_DOWN 但我目前无法将其转换回来: char[256] keyname; some_method_to_read(&keyname, "DPAD_LEFT"); //keyname now contains "KEY_LEFT" 我如何获得相应的键码(例如105 )? 有没有一个标准的方法来做到这一点? 编辑:我现在能想到的唯一方法是通过复制我的源代码中的所有键码,并将它们放在数组或映射中,就像evtest实用程序一样。 但是有很多关键代码,这对我来说似乎有点矫枉过正。 另外,在某些时候,这可能会与<input/linux.h>中定义的键码不同步。 std::map<string, int> keynames; #define MAP_KEYCODE(keycode) keynames[#keycode] = keycode MAP_KEYCODE(KEY_LEFT); MAP_KEYCODE(KEY_RIGHT); MAP_KEYCODE(KEY_UP); MAP_KEYCODE(KEY_DOWN); // […]

根据.config分割Linux内核源代码

有没有什么有效的方法(也许通过滥用gcc预处理器?)来获取一组剥离的内核源代码,根据.config不需要的所有代码都被忽略了?

Linux内核代码中的Cmacros扩展

我一般在C中使用macros时忽略了macros,但我想我知道它们的基本原理。 当我读linux内核列表的源代码时,我看到了类似这样的东西: #define LIST_HEAD_INIT(name) { &(name), &(name) } #define LIST_HEAD(name) \ struct list_head name = LIST_HEAD_INIT(name) (您可以从这里访问代码的其余部分。 ) 我不明白在LIST_HEAD_INIT中的符号(我不认为它们是这里的操作数的地址)的function,所以在代码中使用了LIST_HEAD_INIT。 如果有人能够启发我,我将不胜感激。

Linux内核如何维护大量的configuration选项?

这个问题是关于configuration维护和testing。 如果使用错误, #ifdef, #ifndef, #elseif, #elif, #else, #endif预处理指令不仅会降低C代码的可读性和可维护性,还会增加回归bug的风险(例如,构buildconfiguration尚未经过一段时间的testing)。 我不知道Linux内核如何能够维护大量的configuration选项,而不会陷入完整的维护地狱? 我知道这对于各种不同的硬件来说是必须的,但是作为一个应用程序开发人员,configuration选项的数量看起来真的令我感到害怕。 您认为以下哪个陈述是正确的? 大多数供应商仅针对其目标平台使用一组标准configuration,因此大多数可能的configuration组合都未经过testing或使用 存在一个非常严格的编码准则,允许引入新的#ifdef's仅用于明显可分离的代码片段,禁用某个function(以及负责做出这些决定的正确的负责人) 每个新的内核版本都有这么多的testing人员,以至于configuration相关的错误得到及时修复,因为大多数错误可能只是构build回归 编辑:我意识到,有testing机器select随机configuration,并检查他们build立和引导。 但是,这些简单的构build/启动testing不能检测到任何严重的破坏,而不是破坏所有内容的错误

文件本地定义

这个问题更多地落入最佳实践的范畴,以及清洁/安全的分发代码。 我正在用C ++编写一个math库,用于我的作品集,并在我的最后两个学期使用。 我希望这个库很容易使用,并尽量减less与现有代码冲突的可能性。 为了便于阅读,我将TEMP_T定义为一个类的模板,位于每个头文件(math/matrix/ vec / quaternion)的顶部。 它看起来像下面这样: #ifdef TEMP_T #define UNDEF_TEMP_T TEMP_T // Used to reset any other definitions later. #endif // TEMP_T #define TEMP_T template<class T> // Used to make the code more readable. 之后,在文件末尾,我重置了现有的定义,如果需要的话使用以下命令: #undef TEMP_T // Get rid of our definition. #ifdef UNDEF_TEMP_T #define TEMP_T UNDEF_TEMP_T // Reset the previous […]

Microsoft编译器下_rdrand_step内在函数的可用性?

根据微软的x64(amd64)Intrinsics列表 ,微软提供了一个固有的RDRAND: _rdrand16_step _rdrand32_step _rdrand64_step 但是,页面并没有讨论检测内在的可用性。 有一个脚注[2] ,但它说,它只适用于英特尔CPU。 我有两个问题。 首先,我如何检测内部函数的可用性。 也就是说,我应该使用什么样的预处理器macros来防止调用_rdrand64_step 。 其次,如何在AMD CPU下访问RDRAND。 根据AMD手册,AMD也提供这个function。 (更幽默地说,微软称之为amd64 Intrinsic List页面,当他们不包括AMD的时候,他们为什么称之为AMD64固有列表) 有关AMD和RDRAND指令,请参阅AMD64体系结构程序员手册第3卷:通用和系统指令 ,第278页。