-o更改输出文件名(我发现使用--help)
但是我找不到什么-Wall呢?
以这种方式将整数转换为布尔值的原因是什么?
bool booleanValue = !!integerValue;
Run Code Online (Sandbox Code Playgroud)
而不仅仅是
bool booleanValue = integerValue;
Run Code Online (Sandbox Code Playgroud)
我所知道的是,在VC++ 7中,后者将导致C4800警告而前者不会.这两者之间还有其他区别吗?
偶尔编写一下根本不会发出警告的C++代码是很困难的.然而,启用警告是一个好主意.因此,通常需要禁用某些特定构造周围的警告,并在所有其他代码段中启用它们.
到目前为止,我已经看到了两种方法.
第一个是使用#pragma warning( push )和#pragma warning( pop ):
#pragma warning( push )
#pragma warning( disable: ThatWarning )
//code with ThatWarning here
#pragma warning( pop )
Run Code Online (Sandbox Code Playgroud)
第二是使用#pragma warning( default ):
#pragma warning( disable: ThatWarning )
//code with ThatWarning here
#pragma warning( default: ThatWarning )
Run Code Online (Sandbox Code Playgroud)
我在第二个变体中看到的问题是它丢弃了原始警告级别 - 警告可能在此之前已关闭或警告级别可能已被更改.使用default会丢弃这些改动.
第一种方法看起来很干净.它有什么问题吗?有没有更好的方法来实现同样的目标?
我已经为IIS7安装了静态和动态压缩,并web.config在我的应用程序Virtual Folder级别设置了两个值.据我了解,我不再需要在服务器或站点级别启用压缩,我可以使用我的web.config文件在每个文件夹的基础上管理它.
我的.config文件中有两个设置,我已经设置为我的应用程序自定义gzip:
<httpCompression dynamicCompressionDisableCpuUsage="90"
dynamicCompressionEnableCpuUsage="0">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<dynamicTypes>
<remove mimeType="*/*"/>
<add mimeType="*/*" enabled="true" />
</dynamicTypes>
</httpCompression>
<urlCompression doDynamicCompression="true"
dynamicCompressionBeforeCache="true" />
Run Code Online (Sandbox Code Playgroud)
但是,当我运行应用程序时,我可以清楚地看到没有使用gzip,因为我的页面大小是相同的.我也在使用YSlow for FireFox,这也证实我的页面没有被gziped.
我在这里错过了什么?在IIS6中,只需指定文件类型,并将压缩级别设置在0-10之间即可.我没有记录需要记录指定文件类型或压缩级别,因为默认值似乎涵盖了文件类型,我没有在任何地方看到级别.
在Win32 API编程中,通常使用struct具有多个字段的C s.通常只有其中几个具有有意义的值,而其他所有值都必须归零.这可以通过以下两种方式之一实现:
STRUCT theStruct;
memset( &theStruct, 0, sizeof( STRUCT ) );
Run Code Online (Sandbox Code Playgroud)
要么
STRUCT theStruct = {};
Run Code Online (Sandbox Code Playgroud)
第二个变体看起来更干净 - 它是一个单行,它没有任何可能输错的参数并导致错误被种植.
与第一个变体相比,它有任何缺点吗?使用哪种变体?为什么?
如果我将迭代器指向向量的最后一个元素时,它会增加2怎么办?在这个询问如何通过2个元素调整到STL容器的迭代器的问题中,提供了两种不同的方法:
当迭代器指向STL容器的最后一个元素或更远时,我用VC++ 7测试了它们的边缘情况:
vector<int> vec;
vec.push_back( 1 );
vec.push_back( 2 );
vector<int>::iterator it = vec.begin();
advance( it, 2 );
bool isAtEnd = it == vec.end(); // true
it++; // or advance( it, 1 ); - doesn't matter
isAtEnd = it == vec.end(); //false
it = vec.begin();
advance( it, 3 );
isAtEnd = it == vec.end(); // false
Run Code Online (Sandbox Code Playgroud)
我已经看过有时可以建议在遍历vector和其他容器时与vector :: end()进行比较:
for( vector<int>::iterator it = vec.begin(); it != vec.end(); …Run Code Online (Sandbox Code Playgroud) 如果我运行此代码:
Console.WriteLine( String.Format( "{0}", null ) );
Run Code Online (Sandbox Code Playgroud)
我得到一个,ArgumentNullException但如果我运行此代码:
String str = null;
Console.WriteLine( String.Format( "{0}", str ) );
Run Code Online (Sandbox Code Playgroud)
它运行得很好,输出是一个空字符串.
现在两件看起来相当于我 - 他们都传递了一个空引用String.Format()但行为是不同的.
如何识别不同的行为?
我在几个旧项目中看到过这样的代码:
class Class {
static void Method() {}
};
((Class*)0)->Method();
Run Code Online (Sandbox Code Playgroud)
此代码包含未定义的行为,因为它包括取消引用空指针(无论之后发生什么).这真的没有意义 - 演员是在那里将类型名称提供给编译器,并且编写上面代码的人可以写这个:
Class::Method();
Run Code Online (Sandbox Code Playgroud)
而后者也没关系.
为什么有人会写前代码?它是来自一些美好时光的已知成语还是什么?
我想将小数点更改为C#中的另一个字符.我有一个double变量value
double value;
Run Code Online (Sandbox Code Playgroud)
当我使用命令时:
Console.WriteLine(value.ToString()); // output is 1,25
Run Code Online (Sandbox Code Playgroud)
我知道我可以这样做:
Console.WriteLine(value.ToString(
CultureInfo.CreateSpecificCulture("en-GB"))); // output is 1.25
Run Code Online (Sandbox Code Playgroud)
但我不太喜欢它,因为它很长,而且在我的程序中经常需要它.
是否有一个较短的版本设置"小数点"真的作为点而不是逗号,因为在我的文化中是常见的?