Tag: c preprocessor

包含路径的字符串连接

有没有办法连接2个字符串文字以形成包含路径? 代码存根: #define INCLUDE_DIR “/include” #include INCLUDE_DIR “/dummy.h” 看看这个问题 ,答案指向不同的方向(编译器命令行)。 这里提到它似乎不可能,但我想知道这个话题是否已被挖掘得足够多。 (我确实有一个与此相关的用例,请仅关注此问题的答案/评论。)

部分预处理C或C ++源文件?

有没有办法部分预处理C或C ++源文件? 通过“部分预处理”,我的意思是扩展一些但不是全部的#include指令。 例如,我想扩展#includes指向我的项目头,但#includes指向其他库的头。 我尝试通过运行gcc -E来实现这一点,只有我的项目头的-I标志而不是库的-I标志,但这不起作用,因为gcc在遇到#include时发出错误它无法扩展。 编辑 :我并不关心预处理器在宏扩展方面的行为。

理解C中的宏

为什么以下代码的输出值为5? #include #define A -B #define B -C #define C 5 int main() { printf(“The value of A is %d\n”, A); return 0; }

为什么主编译器对stdint.h使用typedef,而对stdbool.h使用#define?

我只是注意到gcc和clang似乎都对stdint.h使用typedef,而对stdbool.h使用#define。 例如: clang的stdint.h #ifdef __INT8_TYPE__ #ifndef __int8_t_defined /* glibc sys/types.h also defines int8_t*/ typedef __INT8_TYPE__ int8_t; #endif /* __int8_t_defined */ typedef __UINT8_TYPE__ uint8_t; # define __int_least8_t int8_t # define __uint_least8_t uint8_t #endif /* __INT8_TYPE__ */ clang的stdbool.h #ifndef __cplusplus #define bool _Bool #define true 1 #define false 0 #elif defined(__GNUC__) && !defined(__STRICT_ANSI__) /* Define _Bool, bool, […]

如何从C代码生成#define值列表?

我的代码有很多复杂的#define错误代码,这些代码不容易解码,因为它们嵌套在几个级别。 有没有优雅的方法我可以获得#defines列表及其最终数值(或者他们可能是什么)? 举个例子: #define CREATE_ERROR_CODE(class, sc, code) ((class << 16) & (sc << 8) & code) #define EMI_MAX 16 #define MI_1 EMI_MAX #define MODULE_ERROR_CLASS MI_1 #define MODULE_ERROR_SUBCLASS 1 #define ERROR_FOO CREATE_ERROR_CODE(MODULE_ERROR_CLASS, MODULE_ERROR_SUBCLASS, 1) 我会有大量类似的#defines匹配ERROR _ [\ _ W _] +,我想枚举,以便我总是有一个程序可以输出的错误代码的当前列表。 我需要数值,因为这是所有程序将打印出来的(不,它不是打印出字符串的选项)。 对gcc或任何其他编译器的建议会有所帮助。

C块变为表达式:({int a = 1; int b = 2; a + b;})等于3

在阅读http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects时 ,我遇到了这个例子: \#define max(a,b) \ ({ typeof (a) _a = (a); \ typeof (b) _b = (b); \ _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK? 你可以像函数一样使用它,即max(1,2)是一个评估为2的表达式。 我的问题是, ({ statment-list last-expression; })构造如何计算last-expression的值? 具体来说,这个结构的解析树是什么样的? 我认为{ }总是指复合语句,而语句没有值。 我试着在C语法中挖掘,仍然无法解决这个问题。

如何在程序集中访问C预处理程序常量?

如果我在C .h文件中定义一个常量: #define constant 1 如何在程序集.s文件中访问它?

使用预处理器在C中进行模板化

我想知道为什么我以前从未见过以下方法在C中实现模板。 我的想法是让预处理器成为模板工作。 container.h : #ifndef TEMPLATE_TYPE #error “missing decalaration TEMPLATE_TYPE” #endif #define _CONCAT(a, b) a##b #define _EVALUATOR(a, b) _CONCAT(a, b) #define MAKE_NAME(a, b) _EVALUATOR(a, b) typedef struct { TEMPLATE_TYPE data; } MAKE_NAME(Container_, TEMPLATE_TYPE); main.c : #define TEMPLATE_TYPE int #include “container.h” int main() { Container_int c; c.data = 99923; } 那么,情况如何呢? 这只是被认为是“坏风格” 很明显,没有人会写一篇关于它的文章 有很多文章,只是google man! 如果您不打算用#3回答,我将非常感谢您对此技术的评论。

如何使用C / C ++预处理器生成一系列随机数

我想用C预处理器生成一系列随机数,并将它们存储在变量中供我的程序使用。 目的: 我想在每次构建程序时生成一组“唯一”的随机数。 存储随机数的一小部分变量将被有意义的(即非随机的)数字覆盖。 我希望黑客不可能通过调试程序或比较多个构建来区分有意义的数字和随机数。 我希望构建过程自动化并且自包含。 我希望实现可以跨Visual Studio和GCC移植。 澄清: 计算必须在编译时完成,而不是在程序执行时完成。 调试程序的任何人都应该只能看到,例如,一个变量被初始化为一个常量(随机数)。 随机数应该是整数。 随机数生成器应以某种方式从__DATE__和__TIME__ __DATE__ ,这样不同的构建将产生不同的随机数。 能够指定随机数的范围(例如从1到100)将是优选的,但不是绝对必要的。 能够指定要生成的随机数的总数(例如,声明1000个变量并将每个变量初始化为随机数)将是优选的,但不是绝对必要的。 到此为止: 预处理器中的先前运算线程: C预处理器可以执行整数运算吗? 外卖是#if条件可以评估算术。 谷歌搜索显示除了算术,移位和位操作也可以由#if评估。 我已经使用Visual Studio C ++确认了这一点。 简单随机数发生器的候选人: http : //www.ciphersbyritter.com/NEWS4/RANDC.HTM#369B5E30.65A55FD1@stat.fsu.edu这些发生器中的任何一个,或任何不能从给定的逆向工程的发电机一系列随机数,没问题,因为我不需要特别好的发电机。 为了本练习,我们可以使用以下示例: unsigned long jcong=380116160; #define CONG (jcong=69069*jcong+1234567) 我认为基本问题是在连续调用生成器之间存在存储在变量jcong中的状态。 据我所知,预处理器不支持变量赋值。 也许有一些聪明的递归宏可以做到这一点? 我能得到的最接近但不满足预处理器执行的目标是: unsigned long jcong=380116160; unsigned long randomBlock[] = {jcong=69069*jcong+1234567, jcong=69069*jcong+1234567}; 我已经在Visual Studio C ++中确认这确实将数组成员初始化为不同的随机数。 但是,调试器仍然会逐步完成初始化。 […]

使用预处理器部分处理文件

我们inheritance了一个非常卷积的项目(500kloc)和许多预处理器条件逻辑,其中大部分不再相关,我想要清理它。 我是否可以使用预处理器¹仅扩展某些条件逻辑,并将所有其他预处理器宏,定义和包含在输出中? ¹在这里,通过“预处理器”,我的意思是“任何工具”,要么是标准的C预处理器,要么是我可以安装的,甚至是黑客攻击的Perl或Python脚本。 例如,假设我们有这组代码: #include #define baz #define bar(a) do{(a)+1} \ while(0) #ifdef X #if Y > 20 #if Z > 5 so_far_so_good = true; #endif #ifdef baz something(); #endif #else otherthing(); #endif #else #if Z > 10 wow().this.is.bad; #endif #endif 我想要的工具(如果它不存在则可能需要编写)将是CPP的一个版本,它不仅接受特定调用的定义列表,而且还接受在扩展期间要遵守的定义列表。 任何不在第二个列表中的预处理程序符号都是完全不管的。 一个例子是按顺序: cpptreadlight -DY=22 –only=Y 会产生: #include #define baz #define bar(a) do{(a)+1} \ […]