小编Chr*_*uin的帖子

我期望用C++编译器编译C代码有什么问题?

如果您使用现有的C代码库并使用C++编译器进行编译,那么您可能会遇到什么样的问题?例如,我认为将一个整数分配给具有枚举类型的值将在C++中失败,而在C中它是合法的(如果有点讨厌).

如果我没有包装我的所有C文件extern C { ... },我是否会在最不期望的地方获得名称错误?有什么理由我真的不应该这样做吗?

作为背景,我们有一个用C编写的非常大的代码库.几年来,我们一直在跳过箍来做一些自然而然的事情来通过C++(例如homebrewe继承).我们希望开始转向C++,但是要逐步进行; 获得我们类似CORBA的框架来支持它,并在我们继续使用C++提供的更自然的方法时重构模块.

c c++ migration compiler-construction language-interoperability

34
推荐指数
4
解决办法
4万
查看次数

初始化非常大的结构的正确方法是什么?

在我们的代码中,我们曾经有类似这样的东西:

   *(controller->bigstruct) = ( struct bigstruct ){ 0 };
Run Code Online (Sandbox Code Playgroud)

这曾经很好用,然后我们升级了GCC版本并突然开始看到堆栈溢出.看看程序集,旧的GCC代码(2.x)基本上是这样做的:

memset(controller->bigstruct, 0, sizeof(struct bigstruct));
Run Code Online (Sandbox Code Playgroud)

新的GCC(3.4.x)正在这样做

   struct bigstruct temp = { 0 };
   controller->bigstruct = temp;
Run Code Online (Sandbox Code Playgroud)

在审查了C99规范后,我明白了为什么; C99基本上要求堆栈上存在匿名结构.这是一个很好的概念,但是这个结构大了4兆字节,而且只能在堆上存在!

我们已经使用了我们自己的'初始化'功能来明确设置成员,但这很难看并且是一个维护问题.我不认为memset是一个合适的解决方案,因为我不知道0的位值是该类型的适当零值(我知道,但是你知道,但是你有;我不介意编译器做到了,因为它可以知道)

初始化像这样的大型结构的"正确"或至少是最好的方法是什么?

为了进一步阐明我认为memset不是解决方案的原因:未明确初始化的成员的初始化规则与静态初始化相同,如下: - 如果它有指针类型,则初始化为空指针; - 如果它有算术类型,则初始化为(正或无符号)零; ...

'memset'会将内存设置为位模式为零,这不一定是一回事.想象一下不使用IEEE浮点数的系统.不寻常,但由C支持.0.0的表示不一定意味着"全位零",它可以是处理器方便的任何东西.

c struct

23
推荐指数
2
解决办法
2万
查看次数

获取股票的历史数据

我们想使用HTTP请求检查库存的历史数据,并获取JSON.

使用yahoo API,我发现很难不仅清楚地理解HTTP请求字段,而且还要获取某一天的数据(不是每天的平均值,而是某一天的值),其中:

http://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20yahoo.finance.historicaldata%20where%20symbol%20%3D%20%22AAPL%22%20and%20startDate%20%3D%20%222012-09-11%22%20and%20endDate%20%3D%20%222014-02-11%22&format=json&diagnostics=true&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&callback=

1.在任何地方都没有解释如何设置每个字段(也不在雅虎控制台).

2.你不能设置的某一天,并得到其值.

除了雅虎之外,还有免费的稳定解决方案吗?或者,有人可以帮我理解请求中所有这些垃圾的标志吗?

algorithmic-trading yahoo-finance

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

C的单元测试框架

可能重复:
单元测试C代码

我已经看到了一些特定于C++的问题,但我真的很好奇C.我正在尝试在我们的构建环境中添加一个标准的单元测试框架.我的主要目标是鼓励我们的开发人员编写单元测试,并将这些测试标准化,以便其他人可以运行它们.理想情况下,我想将单元测试作为我们每晚构建的一部分.

我们开始使用CUnit进行一些工作,除了一切都在一个线程中运行并且任何内存故障导致单元测试停止运行之外,它起作用了,这很烦人.我还发现编写测试非常困难,但这可能只是对你进行单元测试.

有人知道好的替代品吗?有没有人对使用C-only代码的C++单元测试人员有任何经验?

c unit-testing

7
推荐指数
0
解决办法
2229
查看次数

面向对象的方式将模型与其表示分开

假设我们有一个对象代表一块硬件的配置.为了论证,温度控制器(TempController).它包含一个属性,即设定点温度.

我需要将此配置保存到文件中以便在其他设备中使用.文件格式(FormatA)是一成不变的.我不希望TempController对象知道文件格式......它与该对象无关.所以我创建了另一个对象"FormatAExporter",它将TempController转换为所需的输出.

一年后,我们制作了一个新的温度控制器,我们称之为"AdvancedTempController",它不仅具有设定值,而且还具有速率控制,这意味着还有一两个属性.还发明了一种新的文件格式来存储这些属性......我们称之为FormatB.

两种文件格式都能够表示两种设备(如果缺少设置,则假设AdvancedTempController具有合理的默认值).

所以这就是问题所在:不使用'isa'或其他"作弊"方式来确定我拥有的对象类型,FormatBExporter如何处理这两种情况?

我的第一直觉是在每个温度控制器中都有一个方法,可以为该类提供客户导出器,例如TempController.getExporter()和AdvancedTempController.getExporter().这不能很好地支持多种文件格式.

我想到的唯一另一种方法是在每个温度控制器中有一个方法,它返回一个属性列表及其值,然后格式化程序可以决定如何输出它们.它有用,但这看起来很复杂.

更新:进一步的工作,后一种方法并没有真正奏效.如果你的所有类型都很简单,但是如果你的属性是对象,那么你最终只是将问题推到一个级别......你被迫返回一对String,Object值,导出器必须知道什么对象实际上是要利用它们.所以它只是把问题推到了另一个层面.

对于我如何保持这种灵活性有什么建议吗?

oop

6
推荐指数
1
解决办法
376
查看次数

产品线软件开发的优缺点

这里有人实施了SEI定义的软件产品线方法吗?您如何管理变更?你如何测试?您必须处理哪些问题?

多年来,我们基本上一直在尝试遵循产品线方法,但我一直在与项目经理作斗争,他们不想为他们的程序严格要求的测试更改付费,但又想要免费的错误修复。他们还非常害怕他们不需要的代码库发生变化……这并不是不合理的恐惧。

最终我在上次 PDR 中获得了一个行动项目来解释产品线方法以及为什么我认为我们应该遵循它。我发现了softwareproductlines.com,它有一些成功的案例,但没有足够的细节来说明如何应对潜在的陷阱。

methodology software-product-lines

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

代码签名作为构建过程的一部分

我想了解一些有关代码签名的最佳实践.我们有一个基于Eclipse的应用程序,并认为签署我们的插件是合适的.这提出了很多问题:

  • 私钥可以/应该在源代码管理中吗?

  • 我们是否应该将代码签署为我们每晚构建过程的一部分或作为我们发布过程的一部分?

  • 代码是应该自动签名,还是有理由说这应该是手动步骤?

我倾向于说,"是","每晚"和"自动",但我可以看到只有签署发布产品的论据.我甚至可以证明SQA应该在验证后对代码进行签名,尽管这会使我们的发布过程变得非常糟糕.

其他人如何管理这个?

eclipse-plugin process code-signing

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

在Java中的OutputStream上切换写入器

我有一个方法打开一个文件并传递给另一个函数来写一些数据.第二种方法想要使用PrintWriter来写入其数据.但是,我不想要求每个人都使用PrintWriter写入该流.

目前它看起来像这样(消毒的例子......不要批评我选择的方法或变量名称)

public void exportRawDataIntoStream(OutputStream os) {
    PrintWriter pr = new PrintWriter(os);
    printFirstData(pr);
    printSecondData(pr);
}

public void exportToFile(File file) {
    OutputStream os = null;
    try {
        os = new BufferedOutputStream(new FileOutputStream(file));
        exportRawDataIntoStream(os);
                doMoreWithTimeFile(os);
    } finally {
        if (os != null) {
            try {
                os.close();
            } catch (Exception e ) {
                e.printStackTrace();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

除非我在exportRawDataIntoStream的末尾加上'pr.flush',否则这不起作用.我无法关闭PrintWriter,因为它会关闭整个流.

冲洗是否合法可靠?我是否应该使用其他方法将Writers混合在同一个流上,或者我绝对不应该这样做?

java file-io outputstream

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