小编Gio*_*gio的帖子

C++的模块概念

C++仍然是一种不断发展的语言,多年来一直在为它添加新功能.

我在C++中非常想念的一个特性是一个合适的模块概念:使用头文件的当前方法(使用条件#define来确保头文件不包括两次)对我来说似乎绝对不能令人满意.

例如,在我的项目中,我们遇到的问题是我们在许多源文件中有太多"#include",使得编译时间不必要很长:使用Incredibuild构建我们的产品需要45分钟,即使用至少10个核心并行.因此,我们必须花费大量时间手动清理文件,即删除包含以检查它们是否真的需要.

我认为拥有一个可以实现的模块概念是非常有用的

  1. 清楚地将界面与模块的实现分开;
  2. 单独编译接口和模块的主体(当前.h文件每次被包含在其他文件中时反复编译):工具可以读取编译的接口并告诉它导出的类型,函数和类;
  3. 编写用于更轻松地自动重新排列导入的工具(例如,使用Java/Eclipse,可以自动重新排列文件的所有导入).

您是否认为可以定义这样的模块概念并将其集成到C++中,还是太复杂?你知道朝这个方向做出的任何努力吗?

编辑

感谢有关预编译头文件的建议.如果可能,我会尝试一下(我们使用Visual Studio 2008).也许我们以错误的方式使用头文件(?)我们为每个类使用一个头文件.然后我们有一个带有类实现的cpp文件.通常我们最终得到包含30,40个头文件的cpp文件.当我们更改cpp文件时,不再需要某些包含,但很难找出哪些包含.这部分与头文件包含其他头文件的事实有关.

我们花了太多时间重新安排导入,似乎没有一个工具可以自动执行此操作.这会节省我们很多时间.

c++ c++11

7
推荐指数
1
解决办法
3415
查看次数

Java语言是否在其历史记录中保持源代码向后兼容性?

Java在开发过程中是否始终保持源代码向后兼容性?

更确切地说:给定两个Java版本X和Y,其中X <Y,Java X的任何程序也是Java Y的有效程序,具有相同的语义?例如,X = Java 2(或旧的编号为1.2),Y = Java 5.

或者只有JVM级别的兼容性:例如,JVM 5可以运行为JVM 1.2编译的类吗?

如果可以在Java 5(或6或7)上运行Java 2代码,那么我必须遵循的具体步骤是什么?直接使用Java 5编译器编译?使用Java 2编译器编译并在JVM 5上运行?

java backwards-compatibility

7
推荐指数
1
解决办法
790
查看次数

在readFile之后Haskell文件会自动关闭吗?

我想使用Haskell函数

readFile :: FilePath -> IO String
Run Code Online (Sandbox Code Playgroud)

将文件的内容读入字符串.在文档中,我读到"文件是按需读取的,与getContents一样."

我不确定我完全理解这一点.例如,假设我写

s <- readFile "t.txt"
Run Code Online (Sandbox Code Playgroud)

执行此操作时:

  • 该文件已打开.
  • s中的字符实际上是从文件中读取的,但是需要它们来评估某些表达式(例如,如果我评估文件的length s 所有内容将被读取并且文件将被关闭).
  • 一旦读取了最后一个字符,readFile就会关闭与此调用相关联的文件句柄(自动).

我的第三个陈述是否正确?那么,我可以在readFile不关闭文件句柄的情况下调用吗?只要我没有消耗(访问)整个结果字符串,句柄是否会保持打开状态?

编辑

以下是有关我的疑虑的更多信息.假设我有以下内容:

foo :: String -> IO String
foo filename = do
                  s <- readFile "t.txt"
                  putStrLn "File has been read."
                  return s
Run Code Online (Sandbox Code Playgroud)

putStrLn执行时,我会(直觉地)期望

  1. s包含文件的全部内容t.txt,
  2. 用于读取文件的句柄已关闭.

如果不是这样的话:

  • 什么s时候putStrLn执行包含什么?
  • putStrLn执行时文件句柄处于什么状态?
  • 如果putStrLn执行的时间s不包含文件的全部内容,实际上何时会读取此内容,何时关闭文件?

io haskell lazy-evaluation

7
推荐指数
2
解决办法
1504
查看次数

如何从C++中的Windows注册表中获取计算机制造商和型号?

我正在编写自己的C++代码,通过读取和解析注册表项来读取Windows计算机上的计算机模型和制造商

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/mssmbios/Data/SMBiosData
Run Code Online (Sandbox Code Playgroud)

Windows/C++/Visual Studio中是否有任何库函数可以直接获取此信息?

c++ windows visual-studio-2010

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

在Racket源代码中选择学生语言

我正在尝试为DrRacket编写一个源文件,该文件指定了如何设计程序教学语言中的一种语言(参见Racket文档).我知道我可以在DrRacket菜单中选择这样的语言,但我想使用#lang指令指定它并让DrRacket自动识别该语言.

我找不到任何关于我需要使用的字符串的文档,而不是racket在初始行中

#lang racket
Run Code Online (Sandbox Code Playgroud)

我在哪里可以找到关于此的文档?或者只能从DrRacket的菜单中选择这些语言?

racket

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

使用Steel Bank Common Lisp运行utf-8编码的脚本

我试图使用SBCL 1.1.7在Ubuntu 12.04上从命令行运行一个通用的lisp脚本.我用脚本启动脚本

$ sbcl --script <my-script.lisp>
Run Code Online (Sandbox Code Playgroud)

由于脚本是UTF_8编码,我收到一些错误消息:

; compiling (DEFUN PRINT-USAGE ...)unhandled SB-INT:STREAM-DECODING-ERROR in thread #<SB-THREAD:THREAD
                                               "main thread" RUNNING
                                                {1002A39983}>:
:ASCII stream decoding error on
#<SB-SYS:FD-STREAM
    for "file ... .lisp"
    {10045745E3}>:

    the octet sequence #(194) cannot be decoded.
Run Code Online (Sandbox Code Playgroud)

我想解决方案是告诉SBCL将源文件视为UTF-8,但我在文档中或谷歌上找不到任何关于如何执行此操作的内容.

任何提示?

sbcl common-lisp

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

为什么这会编译并且是否有任何编译器开关可以使编译器将其报告为错误或警告?

当我在我正在处理的项目的源代码上运行PCLint时,我找到了这个例子.这是代码片段:

QString foo()
{
    return false;
}
Run Code Online (Sandbox Code Playgroud)

我编译了代码并验证它返回一个空字符串.真正的例子是一个大型类中的大型方法,并且在某个远程if分支的某个地方,有这个孤立的

return false;
Run Code Online (Sandbox Code Playgroud)

好吧,这是糟糕的编码,对开发人员感到羞耻(通过使用SVN/blame,我甚至可以找出谁做了这个:-))但是,严重的是,为什么编译器不抱怨?

我的理论是编译器翻译

return false;
Run Code Online (Sandbox Code Playgroud)

return QString(((const char *) false));
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到编译器执行的所有基本步骤来推断它.它首先尝试QString的所有构造函数,然后查找

QString(const * char);
Run Code Online (Sandbox Code Playgroud)

但是之后?它如何确定它可以从bool转到const char*.或者,当你使用指向预期的bool时,它会自动将bool强制转换为任何指针类型吗?

问题的第二部分.因为所有这些隐式类型转换都非常危险(为什么开发人员会写'return false;'如果他们的意思是"返回一个空字符串"?),是否有办法(例如编译器切换)以便至少报告这种情况作为警告?我试过 - 用G ++打开它并没有打印任何警告.

编辑

谢谢你的提示.假似乎有一种特殊的待遇.如果我做

return true;
Run Code Online (Sandbox Code Playgroud)

我明白了:

error: conversion from ‘bool’ to non-scalar type ‘QString’ requested
Run Code Online (Sandbox Code Playgroud)

我在Ubuntu上使用g ++ 4.4.3.正如不同的评论所指出的,其他编译器报告了这个问题.

c++ qt g++

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

在 MIT-scheme 中读取命令行参数

我正在尝试使用 MIT 方案(在 GNU/Linux 下运行的 MIT/GNU 方案,版本 7.7.90.+ || Microcode 15.1 || Runtime 15.7)运行方案程序,我想访问命令行参数。

我查看了文档,但没有找到任何具体内容。我尝试过命令行,但收到​​一条错误消息:

;Unbound variable: command-line
Run Code Online (Sandbox Code Playgroud)

我是否必须加载一些库才能使用命令行,或者是否有其他功能?

scheme mit-scheme

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

编译多个Ocaml文件

我是Ocaml的新手,并试图编写一些小的示例应用程序.我ocamlc在Linux Ubuntu 10.04下使用3.11.2版.我想编译两个文件:

a.ml
b.ml
Run Code Online (Sandbox Code Playgroud)

文件b.ml使用来自的定义a.ml.据我所知,我只能用于ocamlc -c编译.ocamlc当我有所有.cmo文件将它们链接到可执行文件时,我可以调用最后一次.此外,在编译使用另一个文件中的定义的文件时,我必须告诉编译器在哪个.cmi文件中查找外部定义.

所以我的想法是使用:

ocamlc -i -c a.ml > a.mli
ocamlc -c a.mli b.ml
ocamlc -o b a.cmo b.cmo
Run Code Online (Sandbox Code Playgroud)

第一步的工作和生产文件a.mlia.cmo,但在运行第二步,当我得到

File "b.ml", line 1, characters 28-31:
Error: Unbound value foo
Run Code Online (Sandbox Code Playgroud)

where foo是在其中定义a.ml和调用的函数b.ml.

所以我的问题是:如何单独编译每个源文件并指定要在命令行上导入的接口?我一直在查看文档,据我所知,我必须指定.mli要包含的文件,但我不知道如何.

编辑

这里有更多细节.文件a.ml包含定义

let foo = 5;;
Run Code Online (Sandbox Code Playgroud)

文件b.ml包含表达式

print_string (string_of_int foo) ^ "\n";;
Run Code Online (Sandbox Code Playgroud)

真实的例子更大但是有了这些文件,我已经有了上面报告的错误.

编辑2 …

ocaml compilation

5
推荐指数
2
解决办法
2291
查看次数

应用程序空闲时,akka线程使用100%CPU

我正在使用运行AMD四核处理器的Ubuntu 12.04系统上试验akka/scala 2.10.3.

我写了一个服务器,它应该在收到请求时执行一些计算.客户端将使用actor消息发送一些数据(字符串列表).当服务器上的actor接收到列表时,它会将其拆分为四个列表,并有四个子actor对列表进行排序.

到目前为止一切顺利:程序正常运行,我可以验证客户端是否收到了正确排序的列表.

但是在服务器的行为中我有两件事我不明白:

  1. 一旦我启动服务器,即使没有演员正在进行任何处理(他们都在等待消息),我的处理器的所有四个内核的使用率几乎达到100%.这怎么可能?当一些演员计划处理某些消息时,是否应该仅使用核心?
  2. 我原本预计由四个演员完成的工作会自动暗示排序会加速四倍:每个演员都在一个单独的线程中运行,每个线程都由不同的核心运行.然而,事实并非如此:没有观察到加速,甚至基于actor的排序比普通的单线程排序慢得多.原因可能是我的调度程序配置,即默认配置不会自动利用多个核心?

编辑 遵循丹西蒙的建议,我已经研究了问题1的使用visualvm.

visualvm报告几个等待大部分时间的调度程序线程(因此它们似乎没有占用太多CPU时间). visualvm还显示了一些一直在运行的其他线程,即使应用程序没有做任何事情; 至少,我的代码都没有被执行.这些忙碌的线程被命名为New I/O worker #1, #2, #4, #5,New I/O boss #3,New I/O server boss,Signal Dispatcher,RMI TCP Connection(2)-127.0.0.1,Attach Listener,和RMI TCP Accept-0.

我有一些编程akka的经验,但几乎没有配置它的经验,所以我无法理解上述信息.

multithreading scala akka

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