关于C#:’true’未声明(在此函数中首次使用)在opencv中

‘true’ undeclared (first use in this function) in opencv

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Using boolean values in C

我是C的新手,想写一个程序来检测网络摄像头的人脸,我在网上找到了一个,我在EclipseCDT上使用OpenCV-2.4.3,我在网上搜索了解决方案,但没有找到适合我的问题的解决方案,所以把它作为新问题发布。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 // Include header files
 #include"/home/OpenCV-2.4.3/include/opencv/cv.h"
 #include"/home/OpenCV-2.4.3/include/opencv/highgui.h"
 #include"stdafx.h"

 int main(){

//initialize to load the video stream, find the device
 CvCapture *capture = cvCaptureFromCAM( 0 );
if (!capture) return 1;

//create a window
cvNamedWindow("BLINK",1);

 while (true){
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame) break;

    //show the retrived frame in the window
    cvShowImage("BLINK", frame);

    //wait for 20 ms
    int c = cvWaitKey(20);

    //exit the loop if user press"Esc" key
    if((char)c == 27 )break;
}
 //destroy the opened window
cvDestroyWindow("BLINK");

//release memory
cvReleaseCapture(&capture);
return 0;
 }

我得到的错误是"真的"未声明的(第一次在这个函数中使用),它导致了while循环中的问题,我读到使用while(真的)不是很好的实践,但是我应该怎么做。有人能把我救出来吗?


替换为例如

1
while(1)

1
for(;;)

或者可以这样做(在循环之前定义c):

1
2
3
4
5
6
7
8
9
10
11
12
while (c != 27)
{
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame)
        break;
    //show the retrieved frame in the window
    cvShowImage("BLINK", frame);
    //wait for 20 ms
    c = cvWaitKey(20);
    //exit the loop if user press"Esc" key
}

或者根本不使用c,但这将以20毫秒的等待开始循环:

1
2
3
4
5
6
7
8
9
while (cvWaitKey(20) != 27)
{
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame)
        break;
    //show the retrieved frame in the window
    cvShowImage("BLINK", frame);
}

还有第三种可能性:

1
2
3
4
5
6
7
8
9
10
11
for(;;)
{
    //grab each frame sequentially
    IplImage* frame = cvQueryFrame( capture );
    if (!frame)
        break;
    //show the retrieved frame in the window
    cvShowImage("BLINK", frame);
    if (cvWaitKey(20) == 27)
        break;
}

更新:同时想知道定义是否更正确

1
2
#define true  1
#define false 0

1
2
#define true 1
#define false (!true)

或再次

1
2
#define false 0
#define true  (!false)

因为如果我,说,做了:

1
2
3
int a = 5;
if (a == true) { // This is false. a is 5 and not 1. So a is not true }
if (a == false){ // This too is false. So a is not false              }

我会想出一个非常奇怪的结果,我发现这个链接到一个稍微奇怪的结果。

我怀疑以安全的方式解决这个问题需要一些宏,比如

1
2
#define IS_FALSE(a)  (0 == (a))
#define IS_TRUE(a)   (!IS_FALSE(a))


在许多版本的C中没有定义true。如果要使用"布尔值",请参见在C中使用布尔值。


C编译器指出,变量"true"既没有在代码中的任何地方声明,也没有在它包含的头文件中声明。它不是原始C语言规范的一部分。您可以像这样将其定义为宏:

定义真1

然而,使用while(1)更简单、更清晰。如果您需要一个事件循环,通常是这样做的。如果这是"不好的练习",那对我来说是个新闻。

我一直忘了C99。您也可以尝试添加

1
#include <stdbool.h>

如果您的C版本支持它。