明确提到的是分号

时间:2012-12-18 18:37:26

标签: c++ compiler-construction warnings

问题

我使用了一个空话并且意识到了这一点。那么如何禁用编译器警告呢?

  

警告C4390:';' :发现空控制声明;这是意图吗?

可能有一种方法可以明确地说我想要一个空语句。

背景

在开发环境中,debug函数应显示错误消息并退出应用程序。在高效的发布中,它应该什么都不做。所以我为此写了一个宏。

#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif

4 个答案:

答案 0 :(得分:4)

空语句宏的常见习语是:

#define Debug(text) do {} while (0)
正如Ben在评论中指出的那样,在两个版本的宏中使用这种技术是明智的。

#ifdef _DEBUG
#include <iostream>
#define Debug(text) do { cout << "Error: " << text; cin.get(); exit(1); } while (0)
#else
#define Debug(text) do {} while (0)
#endif

这个成语在很多地方都有讨论。例如:

答案 1 :(得分:2)

您可以明确地告诉编译器您没有做任何事情

(void)0;

答案 2 :(得分:1)

Debug用作类似函数的宏,但不像一个:

if( some_condition ) Debug(); else { blah }    // Ooops

此外,它与标准输出流混淆,包括用于调试与发布版本的不同标头,使用保留符号(以下划线开头,后跟大写)_DEBUG(你的意思是使用标准{{1} }?)并且不必要地使用非标准的退出值。

所以不是当前的

NDEBUG

DO

#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif

请注意,上面的代码使用愚蠢的

#ifndef DEBUGGING_H
#define DEBUGGING_H

#include <iostream>      // std::cerr, std::endl
#include <stdlib.h>      // exit, EXIT_FAILURE

#ifdef MYDEBUG
#   define Debug(text) ::debugging::sayByeAndTerminate( text )
#else
#   define Debug(text)
#endif

namespace debugging {
    inline void sayByeAndTerminate( char const* const text )
    {
        using namespace std;
        cerr << "Error: " << text; cin.get(); exit(EXIT_FAILURE);
    }
}  // namespace debugging

也不是双傻

do {} while( false )

因为没有必要为了得到任何东西而写东西。

没有什么是非常好的。

警告:我无法使用Visual C ++ 11重现它(请提供展示行为的完整示例),但只需将其关闭。不要调整代码以适应编译器。只需关闭警告。

免责声明:袖珍代码,不受编辑人员的影响。

答案 3 :(得分:0)

另一个不做任何事情的显式表达式:

kotlin.UninitializedPropertyAccessException: lateinit property context has not been initialized

此语法为Context类型使用C ++默认构造函数,因此在C语言中不起作用。

这是包含单词void(); 的最短有效代码,因此可能比void略胜一筹。