我使用了一个空话并且意识到了这一点。那么如何禁用编译器警告呢?
警告C4390:';' :发现空控制声明;这是意图吗?
可能有一种方法可以明确地说我想要一个空语句。
在开发环境中,debug函数应显示错误消息并退出应用程序。在高效的发布中,它应该什么都不做。所以我为此写了一个宏。
#ifdef _DEBUG
#include <iostream>
#define Debug(text) { cout << "Error: " << text; cin.get(); exit(1); }
#else
#define Debug(text) ;
#endif
答案 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
略胜一筹。