我可以假设(bool)true == (int)1任何C++编译器吗?
我正在编写一个程序,我更喜欢用C++编写,但是,我需要包含一个重新定义bool的C头:
# define false 0
# define true 1
typedef int bool;
Run Code Online (Sandbox Code Playgroud)
显而易见的解决方案是编辑标题来说:
#ifndef __cplusplus
# define false 0
# define true 1
typedef int bool;
#endif
Run Code Online (Sandbox Code Playgroud)
但是,唉,因为图书馆是只读的我不能.
有没有办法告诉gcc忽略这个typedef?或者,我可以用C++编写大多数函数,然后为这两个函数创建一个C包装器吗?或者,我应该把它吸干并用C写出来吗?
我想为我的C++应用程序进行单元测试.
测试班级私人成员的正确形式是什么?创建一个测试私有成员,使用派生类或其他技巧的朋友类?
测试API使用哪种技术?
我有一些看起来像的代码:
static const std::string and(" AND ");
Run Code Online (Sandbox Code Playgroud)
这会导致g ++中的错误,如下所示:
Row.cpp:140: error: expected unqualified-id before '&&' token
Run Code Online (Sandbox Code Playgroud)
所以在诅咒将"和"定义为&&的傻瓜后,我补充道
#ifdef and
#undef and
#endif
Run Code Online (Sandbox Code Playgroud)
现在我明白了
Row.cpp:9:8: error: "and" cannot be used as a macro name as it is an operator in C++
Run Code Online (Sandbox Code Playgroud)
这导致我的问题是什么"和"成为C++中的运算符?我找不到任何表明它的东西,当然除了来自g ++的这条消息
今天我与一位同事讨论了是否要测试是否在课堂上测试私人成员或私人状态.他几乎让我相信为什么它有意义.这个问题的目的不是复制已经存在的关于测试私有成员的性质和原因的StackOverflow问题,例如:将单元测试作为正在测试的类的朋友有什么问题?
在我看来,同事的建议有点脆弱,将朋友声明介绍给单元测试实现课程.在我看来,这是一个禁忌,因为我们将测试代码的一些依赖性引入测试代码,而测试代码已经依赖于测试代码=>循环依赖.即使像重命名测试类这样无辜的事情也会导致破坏单元测试并在测试代码中强制执行代码更改.
我想请C++专家来判断另一个提案,它依赖于我们被允许专门化模板功能的事实.想象一下班级:
// tested_class.h
struct tested_class
{
tested_class(int i) : i_(i) {}
//some function which do complex things with i
// and sometimes return a result
private:
int i_;
};
Run Code Online (Sandbox Code Playgroud)
我不喜欢让i_的吸气剂让它变得可测试.所以我的提议是类中的'test_backdoor'函数模板声明:
// tested_class.h
struct tested_class
{
explicit
tested_class(int i=0) : i_(i) {}
template<class Ctx>
static void test_backdoor(Ctx& ctx);
//some function which do complex things with i
// and sometimes return a result
private:
int i_;
};
Run Code Online (Sandbox Code Playgroud)
通过添加这个函数,我们可以使类的私有成员可测试.注意,不依赖于单元测试类,也不依赖于模板函数实现.在此示例中,单元测试实现使用Boost Test框架.
// tested_class_test.cpp
namespace
{
struct ctor_test_context
{
tested_class& tc_;
int …Run Code Online (Sandbox Code Playgroud) 我一直无法找到是否有一种方法可以在枚举定义中使用关键字,例如:
enum class EServerAction
{
create,
read,
update,
delete
};
Run Code Online (Sandbox Code Playgroud)
在C#中,我可以使用@ char使编译器将其视为标识符.有没有办法在C++(Visual Studio 2015)中执行此操作?
我在C++中读过一篇关于"命名循环习语"的文章:http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Named_Loop
这个成语允许我们写这样的东西:
named(outer)
for(int i = 0 ; i < rows ; ++i) {
named(inner)
for(int j = 0 ; j < cols ; ++j) {
if(some_condition)
break(outer); // exit the 'outer' loop
}
}
Run Code Online (Sandbox Code Playgroud)
这样的构造已经作为许多语言的核心特征存在,例如Java.
根据这篇文章,它可以通过定义两个邪恶的宏来用C++实现:
#define named(blockname) goto blockname; \
blockname##_skip: if (0) \
blockname:
#define break(blockname) goto blockname##_skip;
Run Code Online (Sandbox Code Playgroud)
我知道很多人都想放弃使用goto.我个人发现它在极少数情况下很有用,特别是当我想要break一堆嵌套循环时.这个成语在我看来是一个更清洁的解决方案,但是可以在实际代码中使用它吗?
在本文的讨论页面上,可以阅读:
"不要这样做.你最终会陷入地狱"
所以我的问题是:使用命名循环习语有什么缺点?危险吗 ?如果是,为什么?
奖金问题:是否有可能continue同样实施命名?(我认为使用named(...) for(...;...;...) {}语法是不可能的,但谁知道呢?)
编辑:我同意你的意见,重新定义关键字是令人讨厌的.那么使用#define breakLoop()呢?
我在编写使用为C文件设计的头文件的C++代码时遇到问题.特别是,头文件使用了一个名为class的变量名:
int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs);
Run Code Online (Sandbox Code Playgroud)
这适用于C,因为类不作为关键字,但在C++中,类是.那么无论如何我可以将这个头文件#include到c ++文件中,或者我运气不好?
谢谢.
#include <iostream>
#define true false
#define false true
int main() {
std::cout << false << true;
}
Run Code Online (Sandbox Code Playgroud)
为什么输出"01"?
是否int a = int();一定给我一个零?
怎么样,如果int被取代char,double,bool或指针类型?
请问在语言标准中指定了哪里?