C++仍然是一种不断发展的语言,多年来一直在为它添加新功能.
我在C++中非常想念的一个特性是一个合适的模块概念:使用头文件的当前方法(使用条件#define来确保头文件不包括两次)对我来说似乎绝对不能令人满意.
例如,在我的项目中,我们遇到的问题是我们在许多源文件中有太多"#include",使得编译时间不必要很长:使用Incredibuild构建我们的产品需要45分钟,即使用至少10个核心并行.因此,我们必须花费大量时间手动清理文件,即删除包含以检查它们是否真的需要.
我认为拥有一个可以实现的模块概念是非常有用的
您是否认为可以定义这样的模块概念并将其集成到C++中,还是太复杂?你知道朝这个方向做出的任何努力吗?
编辑
感谢有关预编译头文件的建议.如果可能,我会尝试一下(我们使用Visual Studio 2008).也许我们以错误的方式使用头文件(?)我们为每个类使用一个头文件.然后我们有一个带有类实现的cpp文件.通常我们最终得到包含30,40个头文件的cpp文件.当我们更改cpp文件时,不再需要某些包含,但很难找出哪些包含.这部分与头文件包含其他头文件的事实有关.
我们花了太多时间重新安排导入,似乎没有一个工具可以自动执行此操作.这会节省我们很多时间.
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上运行?
我想使用Haskell函数
readFile :: FilePath -> IO String
Run Code Online (Sandbox Code Playgroud)
将文件的内容读入字符串.在文档中,我读到"文件是按需读取的,与getContents一样."
我不确定我完全理解这一点.例如,假设我写
s <- readFile "t.txt"
Run Code Online (Sandbox Code Playgroud)
执行此操作时:
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执行时,我会(直觉地)期望
s包含文件的全部内容t.txt,如果不是这样的话:
s时候putStrLn执行包含什么?putStrLn执行时文件句柄处于什么状态?putStrLn执行的时间s不包含文件的全部内容,实际上何时会读取此内容,何时关闭文件?我正在编写自己的C++代码,通过读取和解析注册表项来读取Windows计算机上的计算机模型和制造商
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/services/mssmbios/Data/SMBiosData
Run Code Online (Sandbox Code Playgroud)
Windows/C++/Visual Studio中是否有任何库函数可以直接获取此信息?
我正在尝试为DrRacket编写一个源文件,该文件指定了如何设计程序教学语言中的一种语言(参见Racket文档).我知道我可以在DrRacket菜单中选择这样的语言,但我想使用#lang指令指定它并让DrRacket自动识别该语言.
我找不到任何关于我需要使用的字符串的文档,而不是racket在初始行中
#lang racket
Run Code Online (Sandbox Code Playgroud)
我在哪里可以找到关于此的文档?或者只能从DrRacket的菜单中选择这些语言?
我试图使用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,但我在文档中或谷歌上找不到任何关于如何执行此操作的内容.
任何提示?
当我在我正在处理的项目的源代码上运行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.正如不同的评论所指出的,其他编译器报告了这个问题.
我正在尝试使用 MIT 方案(在 GNU/Linux 下运行的 MIT/GNU 方案,版本 7.7.90.+ || Microcode 15.1 || Runtime 15.7)运行方案程序,我想访问命令行参数。
我查看了文档,但没有找到任何具体内容。我尝试过命令行,但收到一条错误消息:
;Unbound variable: command-line
Run Code Online (Sandbox Code Playgroud)
我是否必须加载一些库才能使用命令行,或者是否有其他功能?
我是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.mli和a.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 …
我正在使用运行AMD四核处理器的Ubuntu 12.04系统上试验akka/scala 2.10.3.
我写了一个服务器,它应该在收到请求时执行一些计算.客户端将使用actor消息发送一些数据(字符串列表).当服务器上的actor接收到列表时,它会将其拆分为四个列表,并有四个子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的经验,但几乎没有配置它的经验,所以我无法理解上述信息.