这个问题不是特定于C++,只是使用C++作为例子.
一个普遍的观点是"将所有警告视为错误"(如/WXVisual C++选项)是好的,因为警告是一个等待发生的错误(顺便说一下,链接的线程充满了"我的目标为零警告"语句).
到目前为止,我见过的唯一反驳是某些第三方代码在没有警告的情况下无法编译.
好吧,让我们在这个问题的持续时间假装编译器有一些方法暂时禁用某些代码中的警告(如Visual C++中的这个东西):
#pragma warning(push)
#pragma warning(disable:X)
#include <ThirdParty.h>
#pragma warning(pop)
Run Code Online (Sandbox Code Playgroud)
然后第三方代码不再是问题.
假设我们完全控制所有代码(没有第三方或我们可以仅在第三方代码中禁用警告),不将警告视为错误的原因是什么?
c++ language-agnostic compiler-construction compiler-warnings visual-c++
这是对这个问题的一种后续行动.Windows SDK具有以下HANDLE定义的数据类型WinNT.h:
typedef void *HANDLE;
Run Code Online (Sandbox Code Playgroud)
此数据类型用于表示句柄.从技术上讲,句柄不是指针 - 它只是与Win32函数一起使用的神奇值.然而,它被声明用一个void*typedef 数据类型表示.
如果我想使用以下代码输出句柄十六进制值:
HANDLE handle = ...;
printf("%p", handle);
Run Code Online (Sandbox Code Playgroud)
它会合法吗?
根据MSDN,__ RTTynamicCast()函数用于dynamic_cast在Visual C++中实现.其参数LONG VfDelta之一被描述为"对象中虚函数指针的偏移".
AFAIK vptr始终位于对象的起始位置,因此偏移量始终为零.我仔细研究了使用的各种代码片段的反汇编,dynamic_cast我从来没有见过任何东西,只有零被传递代替这个参数.
是否vptr位于任何地方,但物体开始?这种偏移可以是零吗?
我有这个代码:
DbSet<TableName> table = ...// stored reference
var items = from n in table where
n.Name.ToUpper().Contains(searchString.ToUpper().Trim())
select n;
WriteToLog( items.ToString() );
Run Code Online (Sandbox Code Playgroud)
最后一行输出生成的SQL.这是我得到的:
SELECT
[Extent1].[Name] AS [Name],
// all the other columns follow
FROM (SELECT
[TableName].[Name] AS [Name],
// all the other columns follow
FROM [dbo].[TableName] AS [TableName]) AS [Extent1]
WHERE ( CAST(CHARINDEX(LTRIM(RTRIM(UPPER(@p__linq__0))), UPPER([Extent1].[Name])) AS int)) > 0
Run Code Online (Sandbox Code Playgroud)
你看,有SELECT-from- SELECT虽然它完全是多余的-一个SELECT是刚刚够.使用EF的代码运行时间超过半分钟,并且该查询超时,尽管表格相当小.
为什么会生成这种过度设计的SQL查询,如何使EF生成更好的查询?
我有一个SQL表,其中包含一个类型的列,nvarchar(20)并希望使用该列读取该列SqlDataReader.看起来这样做的唯一方法是使用GetSqlChars()后跟ToSqlString():
String result = reader.GetSqlChars(index).ToSqlString().Value
Run Code Online (Sandbox Code Playgroud)
问题是,如果存储的值恰好为null(并且这对我的情况有效),我得到
[SqlNullValueException: Data is Null. This method or property cannot be called on Null values.]
System.Data.SqlTypes.SqlString.get_Value() +3212527
Run Code Online (Sandbox Code Playgroud)
所以我得先检查什么返回的值ToSqlString()的回报IsNull():
SqlString asSqlString = reader.GetSqlChars(index).ToSqlString();
String result = asSqlString.IsNull() ? null : asSqlString.Value;
Run Code Online (Sandbox Code Playgroud)
它有效,但需要大量额外的代码,看起来真的很不优雅.
是否有更优雅的方式来达到同样的效果?
我正在用Visual C++编译一些第三方C代码.源树包含以下.def文件:
LIBRARY "ThirdParty.dll"
EXPORTS
ThirdPartyFunction @1
Run Code Online (Sandbox Code Playgroud)
并且在定义附近没有明确的调用约定规范(如__stdcall或__cdecl)ThirdPartyFunction().Visual C++项目属性(C++ - >高级 - >调用约定)设置为__cdecl (/Gd).
哪个调用约定将用于导出的函数,如何确保它是那个约定?
引用的代码来自这个答案,但类似的代码几乎无处不在。假设我们需要使用System.Security.Cryptography.HashAlgorithm.ComputeHash()接受byte[]. 典型的代码是这样的:
public static byte[] GetHash(string inputString)
{
HashAlgorithm algorithm = MD5.Create(); // SHA1.Create()
return algorithm.ComputeHash(Encoding.UTF8.GetBytes(inputString));
}
Run Code Online (Sandbox Code Playgroud)
字符串在内部存储为 Unicode。
为什么Encoding.UTF8用 代替Encoding.Unicode?
我不太了解5.1.2.3/3的以下部分:
实际实现不需要评估表达式的一部分,如果它可以推断出它的值未被使用并且不产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用).
假设我有以下代码:
char data[size];
int i;
int found;
/* initialize data to some values in here */
found = 0;
for( i = 0; i < size; i++ ) {
if( data[i] == 0 ) {
found = 1;
/* no break in here */
}
}
/* i no longer used, do something with "found" here */
Run Code Online (Sandbox Code Playgroud)
请注意,found以&开头0可以保持不变或变为1.它不能变成1然后变成别的东西.因此,以下代码将产生相同的结果(除了i在循环之后未使用的值):
char data[size];
int i;
int found;
/* initialize data to …Run Code Online (Sandbox Code Playgroud) 每个Azure存储帐户的卷限制为200 TB(200 TB).这听起来真的很大但是如果你将文件存储在每个25兆字节的blob存储中,那么你可以存储大约四百万个文件,这很不错但不是无法用尽的.
我想制作一些代码,定期检查我使用了多少空间并发出警报.
如何以编程方式查找我已在存储帐户中消耗了多少空间?
在这样的代码中:
int val;
if (something())
val = 10;
val++; // Error CS0165 Use of unassigned local variable
Run Code Online (Sandbox Code Playgroud)
CS0165使用局部变量时,如果有可能之前没有正确初始化,我会收到错误消息。
在 C++ 世界中,这种情况是未定义的行为类情况,这意味着任何事情都是允许的。所以也许有一个编译器错误,也许有一个编译器警告,也许有一个运行时错误,也许代码只是使用了当时内存中的任何东西,祝你好运。
是否CS0165保证在 C# 中使用此类代码?
是否存在此特定代码段不产生错误消息的情况?
.net ×4
c# ×4
c++ ×3
visual-c++ ×3
c ×2
azure ×1
c99 ×1
dynamic-cast ×1
encoding ×1
handle ×1
hash ×1
optimization ×1
pointers ×1
rtti ×1
sql ×1
sql-server ×1
unicode ×1
winapi ×1