宏定义的教训

#define DATA_SHIFT 2

#define SPEED_BIT 2

#define DATA_BEGIN  2+SPEED_BIT

#define DATA_AMOUNT 5+720+SPEED_BIT

for(i=DATA_BEGIN;i<DATA_AMOUNT-3;i+=DATA_SHIFT)

{

RangingData[(i-DATA_BEGIN)/DATA_SHIFT]>>8;

....

}

设想RangingData会从0开始变化到359,实际是从4变化到363.

推理时把DATA_BEGIN等效成4,实际不是,实际是2+2.

在进行运算时 i-DATA_BEGIN不是等于i-4,而是i-2+2,所以发生了奇怪的错误。

宏定义只是替换名称,算是深刻体会到了。

时间: 2024-10-28 20:02:43

宏定义的教训的相关文章

快速排序变种实现:一次宏定义引发的熬夜事件

一.背景 睡前忽然想写两行代码练练手,想起快速排序的一种变种实现,于是写了快速排序,在理论上完全没问题的情况下测试结果却很诡异,debug半天发现是宏定义导致,作为经验教训记录下来. 二.快速排序变种实现 原理: |_| |_| |_________________________________________| L    R                     unSorted -------------------------------------------------------

宏定义中的#,##,...,do{}while(0),__VA_ARGS__

宏定义中的#,## 1.在一个预处理器宏中的参数前面使用一个#,预处理器会把这个参数转换为一个字符数组 #define syslog(a) fprintf(stderr,"Warning: " #a"\n"); 2.简单的说,"## "是一种分隔连接方式,它的作用是先分隔,然后进行强制连接 举列 -- 试比较下述几个宏定义的区别 #define A1(name, type)  type name_##type##_type 或 #define A

笔记3:预处理器-(2)宏定义

#define指令称为宏定义指令,通常用#define指令来定义一个宏用来代表其他东西的一个名字(如常量表达式等).通常来说预处理器会通过将宏的名字和它的定义存储在一起来响应#define指令.当这个宏在后面的程序中使用到时,预处理器会"扩展"宏,将宏替换为其定义值. 简单的宏 简单的宏的定义格式: #define 标识符 替换列表 如: #define DTE_LEN 80 #define TRUE 1 #define FALSE 0 #define PI 3.1415926 #de

宏定义中使用do{}while(0)的好处 (转载)

宏定义中使用do{}while(0)的好处   #define MACRO_NAME(para) do{macro content}while(0) 的格式,总结了以下几个原因: 1,空的宏定义避免warning: #define foo() do{}while(0) 2,存在一个独立的block,可以用来进行变量定义,进行比较复杂的实现. 3,如果出现在判断语句过后的宏,这样可以保证作为一个整体来是实现: #define foo(x) /action1(); /action2(); 在以下情况

Android.mk宏定义demo【转】

本文转载自:http://blog.csdn.net/u010164190/article/details/72783963 1.Android.mk  LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := binder_demo_showLOCAL_MODULE_TAGS := optionalLOCAL_SRC_FILES := test.cpp TARGET_BUILD_VARINT := userdebug #宏

c++编译时打印宏定义

#pragma message("this is message") #pragma message只能打印字符串,如果想打印任何宏定义可使用: #define PRINT_MACRO_HELPER(x) #x #define PRINT_MACRO(x) #x"="PRINT_MACRO_HELPER(x) #pragma message(PRINT_MACRO(var)) 如:#define __cplusplus 199911L #pragma message

typedef与define宏定义用于声明新的类型之间的区别

摘自<c专家编程> typedef可以看成一种彻底的封装类型,在typedef声明类型之后不能再往里面增加其他的内容. 例子: #define peach int unsigned peach i; //没问题 typedef int banana; unsigned banana i; //错误,不能增加unsigned #define宏定义只是用于简单的替换 #define int_ptr int * int_ptr chalk, cheese; int * chalk, cheese;

c 预处理的宏定义

概念 以“#”号开头的都是预处理命令 例如 #include <stdio.h>宏定义 宏定义无参数的宏名后不带参数# 表示这是一条预处理命令, define 为宏定义命令.“标识符”为所定义的宏名.“字符串”可以是常数,表达式.格式串等 举例: #define PI 3.1415926 作用: 就是用指定标识符PI来代替数3.1415926 对源程序作编译时, 将先由预处理程序进行宏代换, 即用3.1415926表达式去置换所有的宏名PI, 然后编译 #include <stdio.h

C语言学习——宏定义

1.简单的宏定义 #define <宏名> <字符串> 例:#define LEN 0.5 2.带参数的宏定义 #define <宏名> (<参数表>) <宏体>例:#define Fun(para) para*2 3.实例分析 1 #define VALUE 2+2 2 void main() 3 { 4 int n=VALUE*VALUE; 5 printf("%d",n); 6 } 这段代码的输出是多少呢?16?也许会让