Tag:

为什么C宏不是类型安全的?

如果多次遇到这种说法并且无法弄清楚它应该是什么意思。 由于生成的代码是使用常规C编译器编译的,因此最终会像任何其他代码一样(或很少)检查类型。 那么为什么宏不安全呢? 这似乎是他们应被视为邪恶的主要原因之一。

任何人都可以在下面的例子中解释C预处理器的行为吗?

我正在实现一个C宏预处理器(C99)…… 我对以下行为感到惊讶…. EX1: #define PASTE(x)X _ ## x #define EXPAND(x)PASTE(x) #define TABSIZE 1024 #define BUFSIZE TABSIZE PASTE(BUFSIZE) EXPAND(BUFSIZE) 扩展为: X_BUFFSIZE X_1024 EX2: #define EXPAND(s)TO_STRING(s) #define TO_STRING(s)#s #define四个4 TO_STRING(四) EXPAND(四) 扩展到: “四个一” “4” 我已经完成了C的“免费”标准,但我找不到以下内容…… 实际上预处理器执行了多少次传递? 它首先替换一个宏,然后替换其他宏等等 或者它是否存储并替换为#define s逐个遇到? 文件包含是先完成还是宏扩展?

是否可以在C宏中放置预处理器条件?

有没有办法编写一个C预处理器宏,根据收到的参数扩展到不同的东西? #define foo() ??? /* 1 */ foo(name) /* 2 */ foo(_) 期望的结果: /* 1 */ int name; /* 2 */ /*ignore*/ 是的,我知道宏是邪恶的。 我主要是出于好奇而问这个问题。

是否存在EOF!= -1或WEOF!= -1的常见C环境

C标准使用以下语言定义EOF和WEOF : 7.21.1输入/输出 – 简介 头文件定义了几个宏,并声明了三种类型和许多用于执行输入和输出的函数。 … EOF 它扩展为一个整数常量表达式,类型为int,负值,由几个函数返回,表示文件结束,即不再有来自流的输入; … 7.21.1扩展的多字节和宽字符实用程序 – 简介: 头文件定义了四个宏,并声明了四种数据类型,一个标记和许多函数。 … wint_t 这是一个整数类型,默认情况下,参数提升不变,可以保存与扩展字符集成员对应的任何值,以及至少一个与扩展字符集的任何成员不对应的值 WEOF 扩展为类型为wint_t的常量表达式,其值与扩展字符集的任何成员都不对应。(328)本子条款中的若干函数接受(并返回)它以指示文件结束,即,没有来自流的输入。 它还用作宽字符值,与扩展字符集的任何成员都不对应。 328)宏观WEOF的值可能与EOF的值不同,不必为负值。 EOF是一个负值,它是getc()可以返回的唯一负值。 我已经看到它通常定义为(-1) ,同样WEOF定义为((wint_t)-1) 。 是否有任何常见的C环境,其中这些宏中的任何一个被定义为不同的东西? 标准委员会有什么理由留下不同价值的可能性,特别是对WEOF的非负价值?

Variadic异质FREE宏

我想要一个宏来释放不同类型的多个(可变数字)指针。 基于SO中的类似问题,我制作了这个代码似乎有效 #include #include #include /* your compiler may need to define i outside the loop */ #define FREE(ptr1, …) do{\ void *elems[] = {ptr1, __VA_ARGS__};\ unsigned num = sizeof(elems) / sizeof(elems[0]);\ for (unsigned i=0; i < num; ++i) free(elems[i]);\ } while(0) int main(void) { double *x = malloc(sizeof(double)); /* your compiler may need a […]

如何在OS X上强制使用64位整数运算?

我试图在OS X 10.5.6上强制64位长整数。 在Apple MacBook Intel Core 2 Duo上运行。 这是我的c代码: #include int main() { long a = 2147483647; /*== 2^32 – 1*/ long aplus1; printf(“a== %d. sizeof(a) == %d \n”, a, sizeof(a)); aplus1 = a+1; printf(“aplus1 = %d \n”, aplus1); } 没有任何开关进行编译会产生以下结果: $ gcc testlong.c -o testlong ;./testlong a== 2147483647. sizeof(a) == 4 aplus1 = […]

变形示例代码

所以我一直致力于实现James Holderness的变形代码示例 : Metamorphic Code Examples 。 #include #include #include #include #include #define PUSH 0x50 #define POP 0x58 #define MOV 0xB8 #define NOP 0x90 #define ADD 0x01 #define AND 0x21 #define XOR 0x31 #define OR 0x09 #define SBB 0x19 #define SUB 0x29 #define JUNK asm __volatile__(PUSH,NOP,NOP,NOP,NOP,NOP,NOP,NOP,NOP,POP) #define JUNKLEN 8 const unsigned char prefixes[] = {ADD, […]

错误:可能无法初始化可变大小的对象

#define L 1 #define M L+1 int main(void){ int N=L*M*2; char s [N]={‘1′,’2’}; printf(“%d”, sizeof(s)); return 1; } 为什么上面的代码无法编译? Eclipse的编译器说了两件事: 可变大小的对象可能无法初始化:是因为在宏中使用M和L定义N还是因为我无法初始化类型为 arr [x]的数组,其中x在任何情况下都是可变的? 数组初始值设定项中的多余元素 – 这是什么意思?

枚举成员的字符串化

我需要将枚举成员(其值,而不是标识符)转换为字符串。 我尝试了以下,它适用于MACRO(TYPE_A),但不适用于枚举值(typeA)。 在我看来,这有点奇怪。 你知道怎么做吗? #define _tostr(a) #a #define tostr(a) _tostr(a) typedef enum _SPECIAL_FOLDER_ID { typeA = 3, typeB = 4, } SPECIAL_FOLDER_ID; #define TYPE_A 3 int main() { //this is working, but the information is a macro (TYPE_A) printf(“The string is ” tostr(TYPE_A) “.\n”); //this is not working for typeA (defined in an enumeration) printf(“The […]

Atmel C Pin Manipulation宏

所以我已经在Atmel C编程了一段时间,我已经习惯了所有的C位操作,所以现在我想隐藏它。 我想隐藏位操作不仅是为了使我的代码更具可读性,而且还使我们的硬件更改或创建新硬件时更容易维护和修改。 所以我问你Atmel C基本引脚操作的最佳宏是什么。 我正在寻找的function是: 将引脚设置为输入或输出 将输出引脚设置为高电平或低电平 读取输入引脚的值 所以我找到了一些我可以使用的宏,但没有一个真正适合我的账单。 链接: http://www.piconomic.co.za/fwlib/group___a_v_r___p_i_o.html (仍需要为每个引脚保留多个定义) http://www.starlino.com/port_macro.html (不编译,AVR Studio 6.2) 在C中更改全局变量 (最好的一个,在“/ * LCD DEFINES * /”下的问题顶部附近) 我真正想要的是这样的: #define LED1 PA1 #define BUTTON1 PB0 set_output(LED1); output_high(LED1); delay_ms(100); output_low(LED1); set_input(BUTTON1); uint8_t tmpVal = get_input(BUTTON1); if( tmpVal == 1 ) { // assuming button IS pressed here } else { […]