宏定义不完整引起的奇怪报错

一 写在开头

1.1 本文内容

记录一次奇怪的报错和解决过程。

二 事情经过

今天在写代码的过程遇到了一个很有趣的事。下面的代码快速扫一遍很难发现其存在的问题,但我在编译它时却遇到了意外的报错。代码和报错情况如下。

 1 #include <stdio.h>
 2 #include <string.h>
 3
 4 #define FALSE
 5 #define TRUE
 6 #define MAX_RANGE_N     10005
 7
 8 static char indexs[MAX_RANGE_N];
 9
10 void ScreenPrimes(char *indexs)
11 {
12     int i, j;
13
14     memset(indexs, TRUE, sizeof(indexs[0]) * MAX_RANGE_N);
15     indexs[0] = indexs[1] = FALSE;
16
17     for (i = 2; i < MAX_RANGE_N; i++)
18         if (indexs[i] == TRUE)
19             for (j = i + i; j < MAX_RANGE_N; j += i)
20                 indexs[j] = FALSE;
21 }
22
23 int main(int argc, char *argv[])
24 {
25     freopen("in.txt", "r", stdin);
26     int i, n, counter = 0;
27
28     ScreenPrimes(indexs);
29     scanf("%d", &n);
30     for (i = 0; i <= n; i++)
31     {
32         if (indexs[i] == TRUE)
33         {
34             if (((i+2) <= n) && (indexs[i+2] == TRUE))
35             {
36                 printf("%d %d\n", i, i+2);
37                 counter++;
38             }
39         }
40         else
41         {
42             continue;
43         }
44     }
45     if (counter == 0)
46         printf("empty\n");
47
48     fclose(stdin);
49     return 0;
50 }

看到没,简直胡闹嘛不是。当时查错的时候硬是完整仔细得看了一遍代码,才发现,报错的原因竟然是宏定义不完整!代码在定义TRUE和FALSE两个宏时后面竟然没写数值!将这两个宏定义改写成如下形式,问题解决!

1 #define FALSE (-1)
2 #define TRUE  0

现在回过头来看一下报错,也确实是这样,报错的地方全都是使用了FALSE和TRUE宏的地方。但这两个宏的使用却是对的,搞得我当时反复在看报错的行,于是,理所当然地没找到出错原因。要想写出BUG少点的代码确实很费功夫,编程有趣但也很累。

原文地址:https://www.cnblogs.com/laizhenghong2012/p/8728671.html

时间: 2024-08-29 05:45:05

宏定义不完整引起的奇怪报错的相关文章

vue+sass定义全局变量,后缀名.scss报错之解决

vue在现在程序员圈中,已经是众所周知了,那么在我们去使用vue的过程中经常会使用强大的css预处理语言sass,那么在这个过程中我们有各种问题,下面我们就简单的介绍其中一个小编碰到的问题: 在使用scss中,我们定义了变量方便更改整个项目的配色,那么我们在main.js中引入全局scss文件,但直接引入scss文件会报错. 那么针对此类问题我们有两种处理方式 第一.各个组件中引入(这个方法的弊端相信大家都看得到,就是需要在每一个组件中引入,写重复的代码)如下: import ../assets

selenium脚本奇怪报错

今天用firefox浏览器运行脚本,刚开始运行的挺好,但是过一会就会卡住不动,还有报这个错误:selenium.common.exceptions.WebDriverException: Message: [object Object]'[object Object]' when calling method: [nsICommandProcessor::execute] 查资料发现,selenium最新的 selenium 2.40 只支持Firefox 27的.只能是把Firefox版本降下

Lync就地升级Skype for Business报错处理一例

Lync Server 2013就地升级Skype for Business Server 2015,So easy ,So do. 一切都按部就班进行,一路过关斩妖,安装必须的IIS KB补丁.SQL RtcLocal/LYNCLocal with sp1.删除原来的Lync Server 2013相关的组件和数据库,再安装Skype for Business Server 2015组件和数据库,一切看起来就是那么顺利. 规划不到位(安装系统和Lync,系统盘空间规划的比较小),必报错,今天讲

全局变量报错:UnboundLocalError: local variable &#39;l&#39; referenced before assignment

总结: 内部函数,不修改全局变量可以访问全局变量 内部函数,修改同名全局变量,则python会认为它是一个局部变量 在内部函数修改同名全局变量之前调用变量名称(如print sum),则引发Unbound-LocalError 在程序中设置的sum属于全局变量,而在函数中没有sum的定义,根据python访问局部变量和全局变量的规则:当搜索一个变量的时候,python先从局部作用域开始搜索,如果在局部作用域没有找到那个变量,那样python就在全局变量中找这个变量,如果找不到抛出异常(NAMEE

iOS开发ARC与MRC下单例的完整写法与通用宏定义

#import "XMGTool.h" /** * 1:ARC下的完整的单例写法:alloc内部会调用+(instancetype)allocWithZone:(struct _NSZone *)zone方法,所以重写该方法,用GCD一次性函数,默认是线程安全的加了一把锁,也可以自己去加锁 @synchronized(self) { if (_instance == nil) { _instance = [super allocWithZone:zone]; } } 2:还要考虑cop

宏定义中的#,##,...,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

宏定义中使用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(); 在以下情况

宏定义的黑魔法 - 宏菜鸟起飞手册

转载:https://onevcat.com/2014/01/black-magic-in-macro/ 宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在业务逻辑上,似乎对宏的使用和依赖并不多.但是使用宏定义的好处是不言自明的,在节省工作量的同时,代码可读性大大增加.如果想成为一个能写出漂亮优雅代码的开发者,宏定义绝对是必不可少的技能(虽然宏本身

VC中预处理指令与宏定义详解

刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预警或者完成一些特殊的功能. 一个经典的例子 使用预处理与宏定义最经典的例子莫过于加在一个头文件中以避免头文件被两次编译.试想这种的情况,有一个文件headerfile.h 它被包含在headerfile1.h中,同时在headerfile2.h 中也被包含了,现在有一个CPP文件,implement.cpp 包含了headerfi