无符号整数溢出由C和C++标准很好地定义.例如,C99标准(§6.2.5/9)声明
涉及无符号操作数的计算永远不会过度流动,因为无法用结果无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模.
但是,这两个标准都声明有符号整数溢出是未定义的行为.再次,从C99标准(§3.4.3/1)
未定义行为的一个示例是整数流上的行为
这种差异是否存在历史或(甚至更好!)技术原因?
在被编译器错误指向后,我注意到clang的stdbool.h文件包括(除其他外)以下行:
#define bool bool
#define false false
#define true true
Run Code Online (Sandbox Code Playgroud)
它们包含在一个间接#ifdef强制执行的块中__cplusplus,因此c ++标记即使stdbool.h是C头也是如此.
那些定义需要什么?我想他们需要一些与预处理器相关的原因,但我有兴趣知道标准的哪个部分或者哪个技术原因使得clang必须包括那些.
我需要在JavaFX中将图像调整为特定尺寸,例如100 x 100像素.
我怎样才能做到这一点?Image或ImageView类可以用于此目的吗?
在编写简短的辅助函数时,我经常发现自己想要使用变量标识符"value"作为参数.当我这样做时,似乎Visual Studio编译这个很好,并且没有任何抱怨:
public void MyMethod(int value, bool option, string message)
{
value = 1;
// More code...
}
Run Code Online (Sandbox Code Playgroud)
但是,Visual Studio会在下面抱怨(正如预期的那样):
private int _myProperty;
public int MyProperty
{
get
{
return _myProperty;
}
set
{
int value = 0;
_myProperty = value;
}
}
Run Code Online (Sandbox Code Playgroud)
这使我相信"值"被视为关键字(或不是),具体取决于上下文.我是C#的新手,据我所知,我没有在其他语言中看到特定于上下文的关键字.
问题: 在属性设置器之外使用"value"作为变量名是否总是安全的?如果没有,何时可以安全地完成?而且,这通常被认为是不好的做法吗?
我很惊讶我无法在SO上找到这个问题,我怀疑有人之前曾问过这个问题.但是,搜索很困难,因为标题中有很多帖子有"变量"和"标识符".我无法在MSDN上找到有关此信息.
编辑:最后一个问题是要询问它是否经常或通常不赞成.它已经改变以反映这一点.
考虑以下类
class Base {
public:
virtual void do_stuff() = 0;
};
class Derived : public Base {
public
virtual void do_stuff() { std::cout << "I'm useful"; };
};
Run Code Online (Sandbox Code Playgroud)
现在让我们说我想让另一个类负责拥有Base派生类型的对象,并通过它们调用它们的do_stuff()方法进行迭代.它看起来像这样,但我不知道T应该声明什么
class Owner {
public:
void do_all_stuff() {
//iterate through all items and call do_stuff() on them
}
void add_item(T item) {
items.push_back(item);
}
vector<T> items;
}
Run Code Online (Sandbox Code Playgroud)
我看到了一些可能性:
T不可能Base,因为我只能添加具体类型的对象Base,所以这是不可能的.
T可以是Base*或Base&,但现在我需要信任调用者add_item()传递一个指针或对一个对象的引用,当我从中检索它时它仍然存在items.我不能解析析构函数中delete的元素 …
我有一个问题,清楚地了解究竟是什么id-expression.我将从最初的C++标准工作草案开始,遵循以下内容:

冒险定义identifier:
标识符是任意长的字母和数字序列.
因此,似乎任意长的字母和数字序列都可以是一个id-expression,但等待:

所以identifier必须先声明它才能成为一个id-expression?那么让我们来看看第7条:

继续...

继续......

我们到达这里:

我将此解释为id-expression需要identifier声明需要的声明id-expression.这似乎是一个循环定义.谁能告诉我哪里出错了?
无论如何,我的解释是必须首先声明标识符才能将其视为一个标识符id-expression,但这不是真的只是一个标识符name吗?该标准规定:
表示实体的每个名称都由声明引入.
那么为什么不把它称之为呢name-expression?
我正在尝试为我开发的Windows服务创建安装程序.这个安装程序在某一时刻有一个自定义用户界面,这是我第一次这样做,所以我安装和卸载了几次服务,以确保安装程序中的所有内容都像我想要的那样.
现在我的问题是,当我尝试安装该服务时,它失败并显示错误1001:指定的服务已经存在,但该服务在注册表,services.msc控制台或者由sc query.
任何人都可以告诉我发生了什么以及如何解决它的线索?谢谢
编辑:谢谢你的回复.我重新打开管理控制台并重新启动计算机,但仍然出现错误.更改ProductCode和UpgradeCode也没有解决问题.在注册表中也绝对没有引用该服务.
我使用WPF中的WebBrowser对象,我在浏览器中加载的页面中调用了一些Javascript代码,如下所示:
myWebBrowser.InvokeScript("myJsFunc", new object[] { foo.Text, bar.ToArray<string>()});
Run Code Online (Sandbox Code Playgroud)
现在,js函数应该迭代第二个参数(一个字符串数组)的元素并相应地做东西.唯一的问题是该参数似乎不会作为js数组传递.
例如,
alert(typeof theArray);
Run Code Online (Sandbox Code Playgroud)
提醒"未知".
从CSharp调用js函数时,将数组作为参数传递的正确方法是什么?
我有以下代码:
#include <iostream>
#include <string>
using namespace std;
struct foo_s {
string a;
string b;
string c;
};
void print_field(foo_s* foo, string foo_s::* field) {
cout << "field: " << field << " - " << foo->*field << endl;
}
int main() {
foo_s my_foo = {
"a",
"b",
"c",
};
print_field(&my_foo, &foo_s::a);
print_field(&my_foo, &foo_s::b);
print_field(&my_foo, &foo_s::c);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它的输出是:
field: 1 - a
field: 1 - b
field: 1 - c
Run Code Online (Sandbox Code Playgroud)
我在理解print_field()函数中发生的事情的细节时遇到了一些麻烦.即:
field?我想是的pointer-to-string-foo_s-member …我有以下OpenCL内核,高斯模糊
__constant sampler_t sampler =
CLK_NORMALIZED_COORDS_FALSE |
CLK_ADDRESS_CLAMP_TO_EDGE |
CLK_FILTER_NEAREST;
__constant float gaussian_kernel[3][3] = {
{0.0625f, 0.125f, 0.0625f},
{0.125f, 0.25f, 0.125f},
{0.0625f, 0.125f, 0.0625f} };
void kernel gaussian_blur(
read_only image2d_t input_image,
write_only image2d_t output_image) {
int x = get_global_id(0);
int y = get_global_id(1);
int2 coords[9] = {
{ x - 1, y - 1 }, { x, y - 1 }, { x + 1, y - 1 },
{ x - 1, y }, { x, y }, { …Run Code Online (Sandbox Code Playgroud) 我正在维护一个构建脚本,该脚本从命令行调用devenv或Incredibuild,以构建由数百个项目组成的动态生成的Visual C++ 2010解决方案.我们正在研究如何改进我们的构建,我想知道是否有办法告诉VS避免使用中间目录.
例如,假设我Foo在解决方案中有一个项目Bar.当我构建时Bar,输出Foo结束于内部Bar/Foo/$(Configuration)/$(Platform)和内部Bar/$(Configuration)/$(Platform).
我想知道是否有一种方法(从命令行或通过编辑项目文件)直接在解决方案的输出目录中进行devenv构建,并且只在那里.另外,为什么我应该/不应该做这样的事情有什么理由吗?
假设有一个Foo类,比如
class Foo {
public:
void bar();
operator bool() const { return true; }
};
Run Code Online (Sandbox Code Playgroud)
然后就可以做到
if(Foo foo = Foo())
{
if(Foo foo = Foo())
{
foo.bar();
}
}
Run Code Online (Sandbox Code Playgroud)
现在我无法掌握这里的范围分辨率(我希望重新声明foo的编译器错误).
我希望foo.bar()在第二个foo上执行(它的范围是"更接近")但是我保证它实际上是与第一个foo不同的对象吗?此外,它们是否各自独立处置(它们的析构函数被称为)在它们各自的if块的末尾?