我从BCB5开始使用C++ Builder开发了一系列Win32 VCL应用程序,并希望将它们移植到ECB2009或其现在所称的任何内容.
我的一些应用程序使用旧的TNT/TMS unicode组件,因此我在整个代码中都有很好的AnsiStrings和WideStrings组合.新版本引入了UnicodeString,以及一些改变c_str等函数行为方式的#defines.
我希望以尽可能向后兼容的方式修改我的代码,以便在必要时仍然可以在BCB2007上编译和运行相同的代码库(以非unicode方式).
特别关注的领域是:
我正在寻找可以应用以简化迁移的指南,同时尽可能保持向后兼容性,而不是刀叉式更改.
如果没有这样的指导方针,也许我们可以在这里制定一些指南?
我有三个密切相关的应用程序,它们是从相同的源代码构建的 - 比方说APP_A,APP_B和APP_C.APP_C是APP_B的超集,APP_B又是APP_A的超集.
到目前为止,我一直在使用预处理器定义来指定正在构建的应用程序,它就像这样工作.
// File: app_defines.h
#define APP_A 0
#define APP_B 1
#define APP_C 2
Run Code Online (Sandbox Code Playgroud)
然后我的IDE构建选项指定(例如)
#define APPLICATION APP_B
Run Code Online (Sandbox Code Playgroud)
...在源代码中,我会有类似的东西
#include "app_defines.h"
#if APPLICATION >= APP_B
// extra features for APPB and APP_C
#endif
Run Code Online (Sandbox Code Playgroud)
然而,我今天早上在脚上射击并且浪费了很多时间,只需从一个文件中省略#include"app_defines.h"的行.一切编译得很好,但应用程序在启动时与AVs崩溃.
我想知道更好的处理方法是什么.以前,这通常是我认为#define可以使用的少数几次之一(无论如何都是在C++中),但我仍然很糟糕,并且编译器没有保护我.
c++ configuration-management c-preprocessor software-product-lines
我有一个使用RemObjects SDK在Delphi/C++ Builder中构建的服务器进程声称支持SOAP请求.
测试SOAP支持的最快捷,最简单的方法是什么?我不想学习新语言/安装新的IDE /花费超过一天...
为了澄清这一点,我已经使用RO本机协议愉快地连接到服务器,并启用了SOAP,但我想测试不基于RO SDK的系统如何使用它.对客户端和服务器使用RO SOAP无法实现此目的......
在C中,以下恐怖是有效的:
myFunc()
{
return 42; // return type defaults to int.
}
Run Code Online (Sandbox Code Playgroud)
但是,在C++中呢?无论如何我都找不到它的参考...
我的编译器(Codegear C++ Builder 2007)目前在没有警告的情况下接受它,但我有评论说这是 C++中的错误.
假设我有一个线程安全的Things集合(称之为ThingList),我想添加以下函数.
Thing * ThingList::findByName(string name)
{
return &item[name]; // or something similar..
}
Run Code Online (Sandbox Code Playgroud)
但通过这样做,我已将线程安全的责任委托给调用代码,该代码必须执行以下操作:
try
{
list.lock(); // NEEDED FOR THREAD SAFETY
Thing *foo = list.findByName("wibble");
foo->Bar = 123;
list.unlock();
}
catch (...)
{
list.unlock();
throw;
}
Run Code Online (Sandbox Code Playgroud)
显然,RAII锁定/解锁对象会简化/删除try/catch/unlocks,但是调用者仍然很容易忘记.
我看过几个替代方案:
ThingList::setItemBar(string name, int value)- 很好,但这些往往会增殖处理这个问题的正确方法是什么?
VS2015崩溃,在使用Windows Phone模拟器运行应用程序时,我尝试使用Phone 8.1和Windows 10 Mobile Emulator.模拟器成功启动但VS无法部署应用程序,结束崩溃.
错误应用程序名称:devenv.exe,版本:14.0.23107.0,时间戳:0x559b7ead错误模块名称:SirepClient.dll,版本:0.0.0.0,时间戳:0x559f6024异常代码:0xc0000005错误偏移量:0x0002c376错误进程id:0x3770错误应用程序启动时间:0x01d123ea21bcb890错误应用程序路径:C:\ Program Files(x86)\ Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe错误模块路径:C:\ Program Files(x86)\ Common Files\Microsoft Shared\Windows电话Sirep\8.1\SirepClient.dll报告ID:d583c604-2aed-41b5-ac84-8223f613cef0错误包全名:错误包相关应用程序ID:
应用程序:devenv.exe Framework版本:v4.0.30319描述:由于未处理的异常,进程已终止.异常信息:位于Microsoft.SmartDevice.Connectivity.Vrapper.ConnectivityWrapper12.CreateConnectedDeviceInstance(Microsoft.SmartDevice.Connectivity)的Microsoft.SvualualStudio.DeviceConnectivity.Interop.ConManServerClass.ConnectDevice()中的Microsoft.VisualStudio.DeviceConnectivity.Interop.ConManServerClass.ConnectDevice()处的System.AccessViolationException. .Device)Microsoft.VisualStudio.ComjectProystem上的Microsoft.SvisualStudio.CommonProject.SmartDevice.Deploy.DeployTask.Execute()中的Microsoft.SmartDevice.MultiTargeting.Connectivity.ConnectableDevice.Connect(Boolean).SilverlightMobileVSProjectFlavorCfg.Deploy(System.Object) )System.Threading.ExecutionContext.Run上的System.Threading.QuereadingUserWorkItemCallback.WaitCallback_Context(System.Object)处于System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)处. System.Threading.QueueUserWork上的System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean)在System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()的System.Threading.ThreadPoolWorkQueue.Dispatch()上的ItemCallback.System.Threading.IThreadPoolWorkItem.ExecuteWorkItem()
我想要一个Typescript Mixin有一个由mixed-into类实现的抽象方法.像这样的东西.
class MyBase {
}
type Constructor<T = {}> = new (...args: any[]) => T;
function Mixin<TBase extends Constructor<MyBase>>(Base: TBase) {
return class extends Base {
baseFunc(s: string) {};
doA()
{
this.baseFunc("A");
}
}
};
class Foo extends Mixin(MyBase) {
constructor()
{
super();
}
baseFunc(s: string)
{
document.write("Foo "+ s +"... ")
}
};
Run Code Online (Sandbox Code Playgroud)
现在,这是有效的,但我真的想让mixin中的baseFunc成为抽象的,以确保它在Foo中实现.有没有办法做到这一点,因为abstract baseFunc(s:string);我必须有一个抽象类,这是不允许mixins ...
我正在使用基于Ubunt 17.04的Linux 18.当我跑步时,rails assets:precompile我得到以下消息Yarn executable was not detected in the system
当我按照本帖子或网页上的安装说明进行操作时,我成功安装了Yarn,但rails一直给我错误
我注意到node.js有Linux Mint的系统包到版本17.2,我试图对Yarn页面执行所有指令并手动安装node.js已安装在我的系统中.
该消息并不能解释问题.如果我运行yarn --help它是有效的,我的yarn --version是0.22
这是我的Linux Mint系统
DISTRIB_ID=LinuxMint
DISTRIB_RELEASE=18
DISTRIB_CODENAME=sarah
DISTRIB_DESCRIPTION="Linux Mint 18 Sarah"
NAME="Ubuntu"
VERSION="16.04 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
UBUNTU_CODENAME=xenial
cat: /etc/upstream-release: Is a directory
Run Code Online (Sandbox Code Playgroud)
更新
这是我$PATH在终端中回显的输出/opt/yarn-0.22/bin,但当我走到那条路径时,没有文件夹,/opt/yarn-0.22所以我需要了解它的安装位置并正确配置PATH SETUP
Path Setup
If you …Run Code Online (Sandbox Code Playgroud) 我正在使用TPageControl,其中某些页面不可见.
这打破了TabIndex和ActivePageIndex属性的正常1:1映射.
在大多数地方,我可以使用ActivePageIndex(或ActivePage本身)来获取当前页面,但我想要一个动态工具提示提示,这需要我确定哪个页面与特定选项卡索引相关联.
如果我调用pageControl.IndexOfTabAt(X,Y),我会得到一个Tab Index,但我不能直接使用它作为Pages []数组的索引,因为某些页面选项卡不可见.
我可以明确地遍历页面,忽略可见的页面,但感觉VCL中应该有一些东西已经为我做了这个......?
这不应该正确编译吗?我"Property 'hello' does not exist on type 'object'.在突出显示的行中收到错误“。
我可以g.hello毫无问题地访问胖箭头功能之外。
class Test {
constructor() {
}
hello() : string {
return "Hello";
}
}
let g : object;
if (g instanceof Test) {
() => {
g.hello(); ////// ERROR HERE /////
};
}
Run Code Online (Sandbox Code Playgroud) c++ ×3
delphi ×2
typescript ×2
abstract ×1
c ×1
c++builder ×1
linux ×1
mixins ×1
pointers ×1
remobjects ×1
soap ×1
tpagecontrol ×1
typeguards ×1
ubuntu ×1
unicode ×1
vcl ×1
yarnpkg ×1