小编sti*_*ijn的帖子

ifstream :: unget()失败.是MS的实施错误还是我的代码错误?

昨天我在相当简单的代码中发现了一个奇怪的错误,它基本上从ifstream获取文本并将其标记化.实际失败的代码会执行许多get()/ peek()调用以查找令牌"/*".如果在流中找到令牌,则调用unget(),以便下一个方法看到以令牌开头的流.

有时,看似仅依赖于文件的长度,unget()调用失败.在内部它调用pbackfail()然后返回EOF.但是在清除流状态之后,我可以愉快地阅读更多字符,因此它不完全是EOF.

在深入研究之后,这里是完整的代码,可以轻松地重现问题:

#include <iostream>
#include <fstream>
#include <string>

  //generate simplest string possible that triggers problem
void GenerateTestString( std::string& s, const size_t nSpacesToInsert )
{
  s.clear();
  for( size_t i = 0 ; i < nSpacesToInsert ; ++i )
    s += " ";
  s += "/*";
}

  //write string to file, then open same file again in ifs
bool WriteTestFileThenOpenIt( const char* sFile, const std::string& s, std::ifstream& ifs )
{
  {
    std::ofstream ofs( sFile );
    if( ( ofs << s …
Run Code Online (Sandbox Code Playgroud)

c++ ifstream visual-studio-2008 visual-studio

5
推荐指数
1
解决办法
942
查看次数

无缓冲的std streambuf实现

为了快速测试一个序列化库,我想创建一个可以读/写套接字的streambuf.我不想在streambuf中使用缓冲区,但让socket处理它.我确信序列化lib只会调用std::istream::readstd::ostream::write.快速浏览一下Microsoft的basic_streambuf实现,可以看出这些调用实际上是直接转发给xsputnxsgetn.

问题是:我可以从streambuf派生并只实现xsputn和xsgetn,并确保使用我的实现的流将始终调用这些方法,而不是sync/overflow/underflow/pback/...?或者我应该覆盖同步等以返回错误,还是标准保证默认实现是正常的?这应该适用于任何通用平台,我不能使用boost :: iostreams.

实际上我会使用这样的东西:

class socket_buf : public std::streambuf
{
public:
    //Socket is a class with std::stream-like read/write methods
  MyBuf( Socket& s ) : sock( s ) {}

protected:
  std::streamsize xsputn( const char* s, std::streamsize n )
  {
    return sock.write( s, n );
  }

  std::streamsize xsgetn( char* s, std::streamsize n )
  {
    return sock.read( s, n );
  }

private:
  Socket& sock;
};
Run Code Online (Sandbox Code Playgroud)

c++ sockets iostream

4
推荐指数
1
解决办法
1880
查看次数

是否有可能"剥离"C#dll?

我使用模块化方法在C#中构建了一个简单的演示应用程序,因此它包含一个可执行文件和几个dll.假设我将它放在一个zip文件中并交给某人,唯一的目的是他们可以通过提取文件并双击exe来试用演示应用程序.

现在,根据我的理解,获取应用程序和dll的每个人都可以在Visual Studio项目中添加对dll的引用,然后开始使用它们所拥有的任何函数/类,只要它们被声明为public.因此,他们可以获得比我希望他们访问更多的访问权限.

有没有办法禁用它,并得到一个像C++ dll一样的系统(例如,我可以给任何人很多C++ dll,如果他们不这样做,他们将很难使用其中的函数/类有头文件)?我可以以某种方式剥离dll,以便它们仍可由exe使用,但不暴露引用?或者是否有属性或我可以在代码中使用说"这个类只能用于由我构建的dlls/exes"?

c# dll

4
推荐指数
1
解决办法
520
查看次数

如何在VisualStudio.csproj中的<Target Name ="AfterBuild">中编写内联代码

如果$(ConfigurationName)不起作用 <AfterBuild>

<Target Name="AfterBuild">
if $(ConfigurationName) == Release (
    <Exec Command="grunt karma:unit --no-color &gt; grunt-karma-output.txt" IgnoreExitCode="true" />
    <Exec Command="type grunt-karma-output.txt" CustomErrorRegularExpression=".*mPhantomJS.*FAILED" IgnoreExitCode="false" />
)
</Target Name="AfterBuild">
Run Code Online (Sandbox Code Playgroud)

如果$(ConfigurationName)工作在 <PostBuildEvent>

<PostBuildEvent>
if $(ConfigurationName) == Release (
    <Exec Command="grunt karma:unit --no-color &gt; grunt-karma-output.txt" IgnoreExitCode="true" />
    <Exec Command="type grunt-karma-output.txt" CustomErrorRegularExpression=".*mPhantomJS.*FAILED" IgnoreExitCode="false" />
)
</PostBuildEvent>
Run Code Online (Sandbox Code Playgroud)

任何人都可以建议如何检查构建是否处于发布模式AfterBuild

msbuild build visual-studio gruntjs

4
推荐指数
1
解决办法
6128
查看次数

Powershell字符串插值是否支持格式说明符

powershell 中典型的字符串格式(例如使用填充或指定数字)可以这样写:

>>> "x={0,5} and y={1:F3}" -f $x, $y
x=   10 and y=0.333
Run Code Online (Sandbox Code Playgroud)

但在 Powershell 中,您还可以使用字符串插值,例如

>>> $x=10
>>> $y=1/3
>>> "x=$x and y=$y"
x=10 and y=0.333333333333333
Run Code Online (Sandbox Code Playgroud)

在 C# 中,字符串插值还支持格式说明符:

> var x = 10;
> var y = 1.0/3.0;
> $"x={x,5} and y = {y:F2}";
"x=   10 and y = 0.33"
Run Code Online (Sandbox Code Playgroud)

有没有办法在 Powershell 中实现这一点?我尝试过很多组合,比如

>>> "var=$($var, 10)"
var=10 10
Run Code Online (Sandbox Code Playgroud)

但它们都不起作用。支持吗?或者有没有一种简洁的方法来调用 C# 来使用它?

更新为 Mathias 的答案,并在 Powershell 的 github 上确认,目前不支持此功能,因此我在这里提出了功能请求

c# powershell string-interpolation

4
推荐指数
1
解决办法
1587
查看次数

清理大量使用模板参数

我在项目A和B使用的日志框架中有一组类.我正在重构框架,因此它可以在项目B和C中使用.重构主要包括提供所有模板参数:项目A可以在嵌入式上运行具有差/无STL实现的设备,而B和C只在PC上运行,但B是单线程而C使用多线程.

这很好用,但结果在我看来是一个非常多的模板参数和一个相当丑陋的typedef混乱.我需要20行来键入我将要使用的所有类,并且还有很多类采用模板参数,他们不使用自己,但是需要能够键入dede他们使用的另一个类(这不是本身就是一件坏事,但最终一切都开始变得非常复杂了.另一个问题是,当我想向A类添加一些功能并且需要添加容器时,A类需要额外的模板参数.因此,看到/使用A类的所有其他类突然也需要额外的参数,从而导致多米诺骨牌效应.

略有夸张的例子:

template< class string, class map, class mutex >
class MessageDestination
{
  typedef Message< string, map > message_type;
  virtual void Eat( const message_type& ) = 0;
}

template< class string, class map, class stream >
class MessageFormatter
{
  typedef Message< string, map > message_type;
  virtual void Format( const message_type&, stream& ) = 0;
}

template< class string, class map, class containerA,
          template< class, class > containerB, template< class, class > class queue, class allocator >
class ThreadedMessageAcceptor
{ …
Run Code Online (Sandbox Code Playgroud)

c++ templates

3
推荐指数
1
解决办法
307
查看次数

如何传播-详细到模块功能?

根据回答这样一个和我自己的经验,PowerShell的可以照顾传播-Verbose(和-Debug)自动,这是非常方便的。但是,当我要传播冗长的功能在模块中时,此操作停止。用于测试此代码:

在名为Modc:的目录中创建一个目录,并添加2个文件:

档案c:\Mod\Functions.ps1

function Show-VerbosityB { [cmdletbinding()]Param()
  Write-Output "Show-VerbosityB called"
  Write-Verbose "Show-VerbosityB is Verbose"
}
Run Code Online (Sandbox Code Playgroud)

档案c:\Mod\Mod.psd1

@{
ModuleVersion = '1.0.0.0'
NestedModules = @('Functions.ps1')
FunctionsToExport = @('*-*')
}
Run Code Online (Sandbox Code Playgroud)

现在创建主脚本,说c:\Foo.ps1

Import-Module c:\Mod

function Show-VerbosityA { [cmdletbinding()]Param()
  Write-Output "Show-VerbosityA called"
  Write-Verbose "Show-VerbosityA is Verbose"
}

function Show-Verbosity { [cmdletbinding()]Param()
  Write-Output "Show-Verbosity called"
  Write-Verbose "Show-Verbosity is Verbose"
  Write-Output "Testing propagation"
  Show-VerbosityA
  Show-VerbosityB
}

Show-Verbosity -Verbose
Run Code Online (Sandbox Code Playgroud)

结果是

PS> . C:\Foo.ps1
Show-Verbosity called
VERBOSE: Show-Verbosity is …
Run Code Online (Sandbox Code Playgroud)

powershell cmdlets

3
推荐指数
1
解决办法
932
查看次数

如何使用模板类修复警告C4793?

cl /c /clr /W4编译器编译下面的代码时说

warning C4793: 'Interface::'vcall'{0}'' : function compiled as native

所以pragma似乎没有任何影响..有没有办法解决这个问题?或者这是一个错误(该编译指示是否适用于非模板类)?可以安全地禁用此警告吗?

#pragma unmanaged

struct Interface
{
  virtual void Foo() = 0;
};

template< class T >
struct UsesFunPtr
{
  UsesFunPtr()
  {
    &T::Foo;
  }
};

void DoIt()
{
  UsesFunPtr< Interface > a;
}

#pragma managed
Run Code Online (Sandbox Code Playgroud)

更新:如果我删除最后一行警告消失 - 所以按照ComicSansMs的回答:究竟是at the time of definition for the template什么时候?任何人都可以解释为什么最后一行,之后没有代码,仍然影响之前的代码?

c++ c++-cli visual-studio-2010

2
推荐指数
1
解决办法
2947
查看次数

是否需要使用const和通用引用的重载?

考虑用于检查参数值等的"契约"函数:

  template< class T >
  const T& AssertNotEmpty( const T& val )
  {
    //raise hell if val empty/0/...
    return val;
  }
Run Code Online (Sandbox Code Playgroud)

例如,可以使用如下:

void foo( const std::shared_ptr< int >& val )
{
  AssertNotEmpty( val );
  //use *val
}

class Bar98
{
public:
  Bar98( const std::shared_ptr< int >& val ) : myVal( AssertNotEmpty( val ) ) {}
private:
  std::shared_ptr< int > myVal;
};

std::shared_ptr< int > x;
//...
AssertNotEmpty( x ); //(1)
Run Code Online (Sandbox Code Playgroud)

现在进入C++ 11,我们希望Bar98按值获取构造函数参数并从中移出:

class Bar11
{
public:
  Bar11( std::shared_ptr< int > …
Run Code Online (Sandbox Code Playgroud)

c++ overloading c++11

2
推荐指数
1
解决办法
215
查看次数

是需要bindingRedirect .config文件还是应用程序中的所有程序集?

使用NuGet为具有多个dll和一个exe的解决方案安装Microsoft.Bcl.Async包,该解决方案使用所有其他dll,NuGet自动为每个项目创建一个.config文件(或添加到现有文件)Bcl包被添加到.

在实践中,我最终得到了> 20个包含相同重定向的配置文件.我理解重定向是必需的,但这实际上是所有程序集所必需的,因为它们都是由单个应用程序加载的(如果重要的话,其中一些是由Prism加载的)?我从输出目录中删除了所有.config文件,只留下app.config,应用程序似乎工作正常.我的假设是正确的,一旦bindingRedirect在启动应用程序时生效,加载到该域的所有其他程序集也会自动使用重定向吗?或者有任何警告吗?我问的主要原因是要知道在重新分发应用程序时是否应该包含所有这些配置文件.

c# app-config base-class-library nuget

2
推荐指数
1
解决办法
1695
查看次数

具有多个STA线程的Wpf应用程序仍会阻止用户界面

不久前,我们使用IronPython将Python脚本添加到Wpf应用程序中.起初,它只是"奴隶",因为例如按钮点击调用脚本然后只是运行完成将控制权返回给Wpf.后来我们添加了'master'脚本:脚本在它自己的线程中运行,并控制应用程序的其余部分.这是相当具有挑战性的,但过了一段时间,在现有的SO内容的帮助下,我们看起来很有效.从来没有真正使用它,直到现在,不幸的是事实证明它不能正常工作.核心原因是虽然有两个单独的STA线程(主要的Wpf一个和一个脚本),因此两个不同的Dispatcher实例,主线程似乎被阻止,因为脚本线程在循环中等待主线程完成(响应在脚本线程上处理的按钮单击并在主线程上启动事件).使用具有单独ui窗口的两个线程的全部意义当然不会发生.到底是怎么回事?

更新它是可重复使用最少的代码,所以我链接到它而不是在这里发布伪代码.在创建代码时,我发现当脚本线程创建的窗口未嵌入(设置MainWindow.hostedWin = false)时,不会发生死锁,并且一切都按预期运行.

回应评论所以有3个关注的线程发挥作用.我们称它们为Python,Ui和Process.Python启动Process并等待它完成.进程调用在Ui上调用.在那一点上不应该做任何事情:毕竟,它是阻塞的Python,而不是Ui,而这个结构的重点是Ui不应该与Python交互.好吧,除了它确实以某种方式.哪个是罪魁祸首.在僵局中,Ui坐在那里,PresentationFramework.dll!System.Windows.Interop.HwndHost.OnWindowPositionChanged(System.Windows.Rect rcBoundingBox) + 0x82 bytes而Process坐在WindowsBase.dll!System.Windows.Threading.DispatcherOperation.DispatcherOperationEvent.WaitOne() + 0x2f bytes那里,而Python就在Thread.Sleep.

这里发生了什么,以及如何解决它?

c# wpf ironpython dispatcher sta

2
推荐指数
1
解决办法
1338
查看次数

“msbuild”不被识别为内部或外部命令、可操作程序或批处理文件。错误

Visual Studio 2019,Windows 11。IBM Blockchain Platform 教程,A5:从外部应用程序调用智能合约,步骤 A5.26:在 VS Code 主菜单中,单击“终端”->“运行构建任务...”:

我收到以下错误:

Executing task in folder src: msbuild /property:GenerateFullPaths=true /t:build /consoleloggerparameters:NoSummary

'msbuild' is not recognized as an internal or external command,
operable program or batch file.
The terminal process "C:\WINDOWS\System32\cmd.exe /d /c msbuild /property:GenerateFullPaths=true /t:build /consoleloggerparameters:NoSummary" terminated with exit code: 1.
Run Code Online (Sandbox Code Playgroud)

到目前为止,每一步都进展顺利。VS更新了。需要帮忙。如果您提供任何建议,请具体说明。我不是程序员或开发人员,有一些经验但不多。我不知道 /PATH/xxx/version 上运行的是什么...除非你告诉我“xxx”是什么。我已经编写了一个区块链(通过教程)并让它运行。谢谢。只是想学习。

windows msbuild ibm-blockchain visual-studio-2019

2
推荐指数
1
解决办法
4627
查看次数