Tag: c preprocessor

C和C ++预处理器之间有什么区别?

C和C ++预处理器之间的行为有什么不同吗? 它们由标准文本的不同段落定义( C标准的第6.10节和C ++标准的第16节)。 我提出这个问题的动机是, 将单引号作为最近被C ++ 14接受的数字分隔符的提议扩展了C ++预处理程序语法以适应这种变化(具体来说,它扩展了pp数的定义),以及我想知道这是否会引入C和C ++预处理器之间的不兼容性,如果是这样,它是否是第一个这样做的function。

在其参数的结构上重载C / C ++预处理器宏

我想编写一个预处理器宏,如果它的参数是带括号的标记元组,它会做一件事,如下所示: MY_MACRO((x, y)) 如果它只是一个令牌,还有其他东西,如下所示: MY_MACRO(x) 那可能吗? 如何区分空格分隔的标记数,即MY_MACRO(x)和MY_MACRO(xy) ? 请注意,我不是试图根据参数的数量重载 – 在所有情况下它都是一元宏。 编辑 :如果他们帮助我愿意使用可变参数宏

在C中使用枚举而不是#defines用于编译时常量是否合理?

在使用C ++一段时间后,我回到了一些C开发阶段。 我已经明白,如果没有必要支持让编译器在编译时为你做更多工作,应该避免使用宏。 因此,对于常量值,在C ++中我会使用静态const变量,或者使用C ++ 11枚举类来实现优秀的范围。 在C中,静态常量不是真正的编译时常量,枚举可能(?或可能不?)的行为略有不同。 那么,更喜欢使用枚举作为常量而不是#defines是否合理? 作为参考,这里有一个很好的列表,包括枚举,#define和C ++中的静态consts 。

包括来自另一个目录的头文件

我有一个主目录A有两个子目录B和C 目录B包含头文件structures.c : #ifndef __STRUCTURES_H #define __STRUCTURES_H typedef struct __stud_ent__ { char name[20]; int roll_num; }stud; #endif 目录C包含main.c代码: #include #include #include int main() { stud *value; value = malloc(sizeof(stud)); free (value); printf(“working \n”); return 0; } 但是我收到一个错误: main.c:3:24: error: structures.h: No such file or directory main.c: In function ‘main’: main.c:6: error: ‘stud’ undeclared (first use […]

是否可以在#define中使用if语句?

我正在尝试使用以下公式制作一个宏: (a^2/(a+b))*b ,我想确保没有除以零。 #define SUM_A( x, y ) if( x == 0 || y == 0) { 0 } else { ( ( ( x * x ) / ( ( x ) + ( y ) ) ) * ( y ) )} 然后我在main中调用宏: float a = 40, b = 10, result; result = […]

C找到静态数组大小(防止错误)

查找静态数组的大小是一种常见操作。 参见: C找到静态数组大小 – sizeof(a) / sizeof((a)[0]) 这可以包装成一个宏,例如: #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) 但是它可能会意外地传入常规指针。 例如: void func(SomeArray **foo) { int i = ARRAY_SIZE(foo); } void func(SomeArray **foo) { int i = ARRAY_SIZE(foo); } 虽然它的有效C,但往往最终成为一个逻辑错误。 它可以防止这种错误(利用每个处理器在零长度位字段上失败) 。 #define ARRAY_SIZE(a) \ ((sizeof(struct { int isnt_array : \ ((const void *)&(a) == &(a)[0]); }) * 0) + \ […]

为GCC运行“轻型”预处理器

有没有办法运行GCC预处理器,但仅适用于用户定义的宏? 我有一些单行和一些#ifdef等条件,我想看看我的代码在扩展时的样子。 实际上,包括扩展,我的fprintf(stderr)变成fprintf(((__getreeent())->_stderr)等。

C / C ++中的#error如何工作?

我从#猜测它只是一个编译时实用程序。 如何在C / C ++程序中使用它? 在互联网上找不到太多。 任何链接都会有所帮助。

C预处理器是否删除了“&*”的实例?

我正在玩gcc并尝试以下代码: int A = 42; int *B = &A; int *C = &*B; 和C == &A ,如预期的那样。 但是当我尝试: int *B = NULL; int *C = &*B; 原来C == NULL ,没有段错误。 所以&*B在取得地址之前实际上并没有取消引用B 我的猜测是预处理器在它们甚至到达编译器之前就剥离了&*和*&实例,因为它们互相否定,但我找不到任何文档来validation这是标准C还是特定于编译器。 预处理器是否会剥离&*和*& ,我可以从任何给定的编译器中获得这种行为吗?

用于C / C ++代码的预处理程序指令#ifndef

在eclipse中,每当我创建一个新的C ++类或C头文件时,我都会得到以下类型的结构。 假设我创建头文件example.h,我得到这个: /*Comments*/ #ifndef EXAMPLE_H_ #define EXAMPLE_H_ /* Place to put all of my definitions etc. */ #endif 我认为ifndef说如果没有定义EXAMPLE_H_,请定义它,这可能是有用的,这取决于您用来编译和链接项目的工具。 但是,我有两个问题: 这是相当普遍的吗? 我不经常看到它。 使用该量规是一个好主意,还是应该直接定义代码。 什么是EXAMPLE_H_究竟是什么? 为什么不是example.h,还是只是示例? 有没有什么特别的,或者可能只是eclipse如何更喜欢自动构建项目?