小编Ign*_*tor的帖子

bash中的局部变量:local vs subshel​​l

据我所知,有两种方法可以在bash函数中创建局部变量:创建子shell或将每个变量声明为local.

例如:

# using local
function foo
{
  local count
  for count in $(seq 10)
  do
    echo $count
  done
}
Run Code Online (Sandbox Code Playgroud)

要么

# using subshell
function foo
{
  (
    for count in $(seq 10)
    do
      echo $count
    done
  )
}
Run Code Online (Sandbox Code Playgroud)

显然,使用子shell的版本更易于编写,因为您不必关心将所有变量声明为本地(更不用说由getopts等工具创建/导出的(环境)变量).但我可以想象创建一个子shell有一个开销.

那么更好的方法是什么?有哪些优点/缺点?

variables bash function local subshell

9
推荐指数
1
解决办法
5723
查看次数

使用Qt Test测试模态对话框

我正在尝试使用QTestLib为GUI应用程序编写单元测试.问题是其中一个插槽使用创建模式对话框exec() ,我发现没有可能与对话框进行交互.

创建对话框的插槽连接到QAction.所以第一个问题是当我在测试中触发QAction时测试阻塞,因为这会导致调用exec().因此,我尝试创建一个执行交互的QThread.但是,这没有帮助.

我已经尝试过的事情(都是在"交互助手"线程中执行的):

  1. 使用发送关键点击次数 QTest::keyClicks()
    • 错误消息"QCoreApplication :: sendEvent()中的结果:无法将事件发送到不同线程拥有的对象"
  2. 发布QKeyEvents使用 QCoreApplication::postEvent()
    • 不起作用,即没有任何反应.我猜是因为事件最终出现在拥有对话框的线程的事件循环中,在对话框关闭并exec()返回之前不会到达. 见下面的编辑
  3. 使用在对话框上调用Slots QMetaObject::invokeMethod()
    • 不起作用,即没有任何反应.我想是因为同样的原因postEvent()不起作用. 见下面的编辑

所以问题是:有没有办法以编程方式与使用该exec()方法打开的模态对话框进行交互?

编辑:实际上,方法3正在运行.问题是另一个问题:我将参数传递invokeMethod()给"交互助手"线程,由于某种原因,访问参数不起作用(我没有SEG错误,但它们只是空的).我想方法2也有效,我只是遇到与方法3相同的问题,但我没有测试过.

qt unit-testing modal-dialog

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

如何在Doxygen代码示例中插入多行注释

我试图在Doxygen文档中包含一个包含多行注释的代码示例.问题是C++预处理器将其解释*/为我的Doxygen注释的结尾,因此文件的语法被破坏了.

例如:

/*! \brief My Doxygen comment.
 *
 * \code
 * myFunction() /* Some multi-line comment */
 * \endcode
 */
Run Code Online (Sandbox Code Playgroud)

我已经尝试过适用于JavaDoc注释的建议:使用HTML实体对斜杠进行编码,如下所示:

* \code
* myFunction() /* Some multi-line comment */
* \endcode
Run Code Online (Sandbox Code Playgroud)

但这不起作用(我猜因为Doxygen不会替换代码部分中的HTML实体).

所以问题是:是否可以在代码示例中包含多行注释,如何才能完成?

c++ comments doxygen

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

qmake额外的编译器,每个文件有多个输出

如未记载的qmake中所述,我在qmake项目文件中声明了一个额外的编译器:

TEST = somefile.h

test_c.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_1.cpp
test_c.input = TEST
test_c.commands = C:/somedir/some.exe /i ${QMAKE_FILE_IN} /o ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_1.cpp
test_c.variable_out = SOURCES
test_c.name = MyTestC

QMAKE_EXTRA_COMPILERS += test_c
Run Code Online (Sandbox Code Playgroud)

这很好用.但我也想生成一个头文件.我可以轻松地创建第二个自定义工具来解析此文件(或文件,如果> 1将在TEST中),但我不想解析每个文件两次.我试过了:

test_c.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_1.cpp \
    ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_BASE}_2.cpp
Run Code Online (Sandbox Code Playgroud)

只是为了测试额外的编译器每次运行可以生成两个文件.我期待像" file somefile_2.cpp doesn't exist" 这样的错误,但项目编译没有错误,第二个输出文件被忽略.在Makefile somefile_2.cpp中不存在.

现在我想到两个变种:

  1. 创建一个额外的编译器来生成存档,其中所有需要的输出文件将立即保存.设置tool1.variable_out = TOOL_1_OUT并添加两个额外的编译器,toolN.input = TOOL_1_OUT只需"解压缩"存档文件(每个工具一个)并将它们附加到一些变量.

    在这种情况下,每个输入文件将调用三次执行.这不是最佳的,但至少解析器每个文件只运行一次.

  2. 尝试.output_function选项.创建一个qmake函数,返回与.output现在相同的名称,但也附加第二个文件名HEADERS.

PS我使用的是MinGW x32 4.7,QtCreator 2.7.1,Qt 5.1.0,C++ 11.

qmake

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

Git失败了"致命:协议错误:错误的行长字符:通过"

需要访问远程存储库的所有git命令都会失败,并显示错误消息:

fatal: protocol error: bad line length character: Pass
Run Code Online (Sandbox Code Playgroud)

他们几天前曾经工作过.

git ssh

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

为什么在Jenkins管道中第二个节点上的步骤失败?

尝试在sh第二步执行步骤node()失败.最小的例子:

node('windows') {
    env.PATH = "C:\\some\\path;${env.PATH}"
    // ...
}

node('linux') {
    sh "echo 'Hello World!'" // this fails
}
Run Code Online (Sandbox Code Playgroud)

错误消息是:

nohup: failed to run command 'sh': No such file or directory
Run Code Online (Sandbox Code Playgroud)

PATH环境变量设置正确为包含sh两个节点上命令.

为什么sh第二个节点上的步骤失败?

jenkins-pipeline

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