我的应用程序在发布模式和调试模式下编译时生成不同的浮点值.我发现的唯一原因是我保存了一个二进制跟踪日志,并且发布版本中的一个从调试版本中略微偏离,看起来32位浮点值的底部两位不同于1/2这些案件.
你会认为这种"差异"是一个错误,还是会出现这种差异?这会是编译器错误还是内部库错误.
例如:
LEFTPOS and SPACING are defined floating point values.
float def_x;
int xpos;
def_x = LEFTPOS + (xpos * (SPACING / 2));
Run Code Online (Sandbox Code Playgroud)
问题在于X360编译器.
编辑:这个问题更多的是关于语言工程而不是C++本身.我以C++为例来展示我想要的东西,主要是因为我每天都在使用它.我并不想知道它是如何工作的C++,但打开它如何的讨论会来完成.
这不是它现在的工作方式,这就是我希望它可以完成的方式,这肯定会打破C兼容性,但这就是我认为extern"C"的全部意义.
我的意思是,在您现在声明的每个函数或方法中,您必须显式写入该对象将通过引用在其上添加前缀作为参考运算符.我希望每个非POD类型都会通过引用自动发送,因为我使用了很多,实际上对于每个大小超过32位的对象,这几乎是我的每一类.
让我们举例说明它是如何做的,假设a,b和c为类:
class example {
public:
int just_use_a(const a &object);
int use_and_mess_with_b(b &object);
void do_nothing_on_c(c object);
};
现在我想要的是:
class example {
public:
int just_use_a(const a object);
int use_and_mess_with_b(b object);
extern "C" void do_nothing_on_c(c object);
};
现在,do_nothing_on_c()的行为就像今天一样.
至少对我来说这会很有趣,感觉更清楚,而且如果你知道每个非POD参数都是通过引用而来的,我相信如果你必须明确地声明它,那么错误将是相同的.
对于这种变化的另一种观点,来自C的人,参考运算符在我看来是一种获取变量地址的方法,这就是我用来获取指针的方式.我的意思是,它是相同的运算符,但在不同的上下文中具有不同的语义,对你来说这不是觉得有点不对吗?
我有一个C++程序将TCP标头表示为结构:
#include "stdafx.h"
/* TCP HEADER
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgment Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | …Run Code Online (Sandbox Code Playgroud) 我注意到写入文件,关闭它并将其移动到目的地随机地在Vista上失败.具体来说,MoveFileEx()将返回ERROR_ACCESS_DENIED没有明显的原因.这至少发生在Vista SP1上(32位).在XP SP3上不会发生.
在互联网上找到关于完全相同问题的这个线程,没有真正的解决方案.到目前为止看起来错误是由Vista的搜索索引器引起的,见下文.
给出的代码示例足以重现问题.我也在这里粘贴它:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
bool test() {
unsigned char buf[] = {
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99,
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99
};
HANDLE h;
DWORD nbytes;
LPCTSTR fn_tmp = "aaa";
LPCTSTR fn = "bbb";
h = CreateFile(fn_tmp, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_ALWAYS, 0, 0);
if (h == INVALID_HANDLE_VALUE) return 0;
if (!WriteFile(h, buf, sizeof buf, &nbytes, 0)) …Run Code Online (Sandbox Code Playgroud) 如果我想调用Bar()而不是Foo(),是否会Bar()返回Foo()返回的副本(额外开销),或者返回Foo()放置在临时堆栈上的同一对象?
vector<int> Foo(){
vector<int> result;
result.push_back(1);
return result;
}
vector<int> Bar(){
return Foo();
}
Run Code Online (Sandbox Code Playgroud) 我正在研究C++.以下是我的代码:
#include <iostream>
using namespace std;
class base
{
public:
virtual void display(int a = 4)
{
cout << "base :: "<< a*a << endl;
}
};
class derived : public base
{
public:
void display(int b = 5)
{
cout << " Derived :: " << b*b*b << endl;
}
};
int main()
{
base *bobj;
derived dobj;
bobj = &dobj;
bobj->display();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Derived :: 64
Run Code Online (Sandbox Code Playgroud)
调用Base类的函数,但使用派生函数的参数的默认值.为什么派生类方法display(),取基类方法参数值?
昨天有人给了我一个错误的节目.在MVS 2010中工作,我发现了问题,也是它的替代方案.问题是重载的插入操作符类.其原型如下......
void matrix :: operator << (matrix&) ;
Run Code Online (Sandbox Code Playgroud)
它是从这样的地方打来的......
matrix m ;
m.operator << (m) ;
Run Code Online (Sandbox Code Playgroud)
我发现编译器不允许发送与调用函数的引用参数相同的对象.但我不明白背后的原因以及它造成了什么问题.如果有人能够解释,我将不胜感激.谢谢.
编辑:
实际发生的是,在调试时,它进入函数内部,在执行时出现main,进入外部依赖文件dbgdel.cpp并在此行停止.
_ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
Run Code Online (Sandbox Code Playgroud) 迭代指针的向量(或其他容器)时,使用以下优势和/或优势是否有任何区别:
for (it = v.begin(); it != v.end(); ++it) {
(*it)->method();
}
Run Code Online (Sandbox Code Playgroud)
要么
for (it = v.begin(); it != v.end(); ++it) {
(**it).method();
}
Run Code Online (Sandbox Code Playgroud) #include <new>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
struct foo {};
inline void* operator new(size_t size, foo*) throw (std::bad_alloc)
{
std::cout << "my new " << size << std::endl;
return malloc(size);
}
inline void operator delete(void* p, foo*) throw()
{
std::cout << "my delete" << std::endl;
free(p);
}
int main()
{
delete new((foo*)NULL) foo;
}
Run Code Online (Sandbox Code Playgroud)
输出(通过ideone):
my new 1
Run Code Online (Sandbox Code Playgroud)
我的想法是,C++会释放一个带有附加参数的对象,并且匹配删除相同的参数,但我显然是不正确的.
获取上述代码调用重载删除的正确方法是什么?
将变量声明为"volatile"意味着直接从内存位置读取/写入,而不是从寄存器变量读取/写入.我对'序列点'有所了解.但我不明白标题中提到的陈述.
有人可以解释一下,并给出一些代码片段吗?
c++ ×9
c ×3
oop ×2
vector ×2
base-class ×1
debugging ×1
dot-operator ×1
function ×1
inheritance ×1
insertion ×1
iterator ×1
new-operator ×1
packing ×1
return-value ×1
semantics ×1
struct ×1
syntax ×1
volatile ×1
winapi ×1
windows ×1