小编ezp*_*zpz的帖子

保留bash函数参数中的引号

我想要做的是,作为函数的输入,可以包括引号(单引号或双引号)和与该函数提供的行完全相同的回声.例如:

function doit {
   printf "%s " ${@} 
   eval "${@}"
   printf " # [%3d]\n" ${?}
}
Run Code Online (Sandbox Code Playgroud)

其中,给出以下输入

doit VAR=42
doit echo 'single quote $VAR'
doit echo "double quote $VAR"
Run Code Online (Sandbox Code Playgroud)

产量如下:

VAR=42  # [  0]
echo single quote $VAR  # [  0]
echo double quote 42  # [  0]
Run Code Online (Sandbox Code Playgroud)

所以变量扩展的语义就像我期望的那样得到保留,但是我无法得到提供给函数的行的确切格式.我想要的是doit echo 'single quote $VAR'结果echo 'single quote $VAR'.

我确信这与bash在传递给函数之前处理参数有关; 我只是想找个方法(如果可能的话).

编辑

所以我的目的是影响脚本的执行,同时提供执行的精确副本,可以用作诊断工具,包括每个步骤的退出状态.

虽然我可以通过做类似的事情获得上述所需的行为

while read line ; do 
   doit ${line}
done < ${INPUT}
Run Code Online (Sandbox Code Playgroud)

面对控制结构(即等) …

bash quotes arguments function

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

便携式等同于gcc的__attribute __(清理)

最近我遇到了一个gcc扩展,我发现它非常有用: __attribute__(cleanup)

基本上,这允许您在退出范围时为局部变量分配清理调用.例如,给定以下代码部分,必须在调用期间的任何和所有情况下显式维护和处理所有内存foo.

void foo() {
   char * buff = ...; /* some memory allocation */
   char * buff2 = 0, * buff3 = 0;
   if (! buff) {
      return;
   } else {
      buff2 = ...; /* memory allocation */
      if (! buff2) {
         goto clean_exit;
      } else {
         /* ... and so on ... */
      }
   }

clean_exit:
   free (buff);
   free (buff2);
   free (buff3);
}
Run Code Online (Sandbox Code Playgroud)

但是,通过使用可以减少到的扩展名

#define clean_pchar_scope __attribute__((cleanup(pchar_free)))

void pchar_free (char ** c) { free (*c); …
Run Code Online (Sandbox Code Playgroud)

c portability gcc garbage-collection scope

15
推荐指数
3
解决办法
4880
查看次数

Haskell:-fglasgow-exts应该避免代码需要这个吗?

我是Haskell的初学者,我开始看到类似的错误:

Illegal parallel list comprehension: use -fglasgow-exts
Run Code Online (Sandbox Code Playgroud)

我在内部工作ghci,ghc但仅仅是因为它是我在搜索中找到的第一个.

我很好奇这是否是一种人们希望避免前进的情况.我发现的任何搜索都提到这些扩展会暴露可能(或可能不)有用的基础设施.

一个具体的例子是

fibs = 0 : 1 : [ a + b | a <- fibs | b <- tail fibs ]
Run Code Online (Sandbox Code Playgroud)

我假设这两个a并且b同时从列表中读取的事实会导致问题......?那么,如果格拉斯哥扩展是支持这种结构的唯一方法,那么更常见的是以另一种方式生成列表或者只是假设扩展可用?

提前感谢任何输入.

[编辑]很抱歉,如果这不完全清楚,但我的问题是,如果包括格拉斯哥(或任何其他)扩展被认为是不好的做法.上面的例子只是为了说明提示这个问题的错误类型.

haskell coding-style

7
推荐指数
3
解决办法
751
查看次数

将任何数据类型序列化为vector <uint8_t> - 使用reinterpret_cast?

我没有找到与搜索直接相关的任何内容,所以请原谅这是否重复.

我想要做的是通过网络连接序列化数据.我的方法是将我需要传输的所有内容转换std::vector< uint8_t >为接收方并将数据解压缩到适当的变量中.我的方法如下:

template <typename T>
inline void pack (std::vector< uint8_t >& dst, T& data) {
    uint8_t * src = static_cast < uint8_t* >(static_cast < void * >(&data));
    dst.insert (dst.end (), src, src + sizeof (T));
}   

template <typename T>
inline void unpack (vector <uint8_t >& src, int index, T& data) {
    copy (&src[index], &src[index + sizeof (T)], &data);
}
Run Code Online (Sandbox Code Playgroud)

我正在使用它

vector< uint8_t > buffer;
uint32_t foo = 103, bar = 443;
pack (buff, foo);
pack (buff, …
Run Code Online (Sandbox Code Playgroud)

c++ serialization templates network-programming

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

C++预处理器字符串文字串联

我发现这是关于C预处理器应如何处理字符串文字串联(第6阶段).但是,我找不到任何关于如何在C++中处理它的东西(C++是否使用C预处理器?).

我问的原因是我有以下几点:

const char * Foo::encoding = "\0" "1234567890\0abcdefg";
Run Code Online (Sandbox Code Playgroud)

where encoding是类的静态成员Foo.如果没有连接的可用性,我就无法编写那样的字符序列.

const char * Foo::encoding = "\01234567890\0abcdefg";
Run Code Online (Sandbox Code Playgroud)

由于\012解释方式,完全不同的东西.

我无法访问多个平台,我很好奇我应该如此自信,以上总是处理正确 - 即我将永远得到 { 0, '1', '2', '3', ... }

c++ concatenation c-preprocessor

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

在Haskell中动态构建列表理解

我很好奇是否有可能在Haskell中动态构建列表理解.

举个例子,如果我有以下内容:

all_pows (a,a') (b,b') = [ a^y * b^z | y <- take a' [0..], z <- take b' [0..] ]
Run Code Online (Sandbox Code Playgroud)

我得到了我想要的东西

*Main> List.sort $ all_pows (2,3) (5,3)
[1,2,4,5,10,20,25,50,100]
Run Code Online (Sandbox Code Playgroud)

但是,我真正喜欢的是拥有类似的东西

all_pows [(Int,Int)] -> [Integer]
Run Code Online (Sandbox Code Playgroud)

这样我就可以N在不构建N版本的情况下支持参数对all_pows.我仍然是Haskell的新手,所以我可能忽略了一些显而易见的事情.这甚至可能吗?

haskell list-comprehension dynamic

3
推荐指数
1
解决办法
826
查看次数

在C++中使用C头时,避免全局变量/方法名称冲突

我最近花了一些时间追逐一个恼人的小虫子,我正在为那些遇到过同样问题或者知道避免它的最佳方法的人寻找建议.

我有一种情况,我正在使用C++开发并使用strerror,因此我使用类似的东西

extern "C" {
#include <string.h>
}
Run Code Online (Sandbox Code Playgroud)

(同样的情况#include <cstring>,顺便说一下).现在,在该文件中定义了一个函数,如下所示:extern char *index (__const char *__s, int __c)这个函数带来了我最初有一个类似于以下构造的乐趣:

for (int index = 0; index != condition (); ++index) {
   // do something with buffer[index] here
}

log->write ("Final value of index: %d\n", index); // <- Ooops!!!
Run Code Online (Sandbox Code Playgroud)

但是没有得到编译错误,我得到了虚假的输出.我的编译器(g ++)标志设置得相当高,以下内容没有捕到这个:

-W -Wall -Wextra -Werror -Wshadow -Wformat -pedantic -ansi

我也不能使用#undef像这样的技巧,<cstring>因为这不是一个宏.

我的问题是其他人是否遇到过同样的问题,最好的解决办法是什么?理想情况下,我很想听听一些模糊的g ++功能,比如-use-the-force-luke=...;)

请注意,我不问如何解决这一确切的问题; 我只能更改变量名称.我正在寻找有关如何避免将来出现这种情况的提示.

编辑:

由于James Curran的回复,我想我应该澄清一下.我不是在看为什么不应该这样.据我所知,在没有局部变量的情况下,范围空间得以扩展.我感到惊讶的是,有没有标志,我可以设置警告说这件事.我倒是觉得-Wshadow …

c++ namespaces

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

C静态内联函数重定义规则

假设在bar.h可能存在:

static inline int fun () { return 2; }
Run Code Online (Sandbox Code Playgroud)

并确保fun始终定义foo.h包含以下内容:

static inline int fun () { return 3; }
Run Code Online (Sandbox Code Playgroud)

bar.h包含定义时,以下是否会引发未定义的行为?

#include "foo.h" /* ensure there is always a definition */
#include "bar.h" /* use the bar definition if it exists */

int main () {
   /* ... */
   int x = fun ();
   /* ... */
Run Code Online (Sandbox Code Playgroud)

使用gcc(4.0.1)(旧的,但它是我目前所拥有的)行为是预期的 - 当缺少条形版本时使用foo版本,并且当它存在时使用条形图版本.

c static function shadow undefined-behavior

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

如何在const集中正确迭代?

我正在研究一个应该代表图形的程序.我的问题在于我的printAdjacencyList函数.基本上,我有一个Graph ADT,它有一个成员变量"nodes",它是该图的节点的映射.每个节点都有一组Edge*连接到它的边缘.我试图迭代图中的每个节点和节点的每个边缘.

void MyGraph::printAdjacencyList() {
std::map<std::string, MyNode*>::iterator mit;
std::set<MyEdge*>::iterator sit;

for (mit = nodes.begin(); mit != nodes.end(); mit++ ) {
    std::cout << mit->first << ": {";
    const std::set<MyEdge*> edges = mit->second->getEdges();
    for (sit = edges.begin(); sit != edges.end(); sit++) {
        std::pair<MyNode*, MyNode*> edgeNodes = *sit->getEndpoints();
    }
}
std::cout << " }" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

getEdges声明为:

const std::set<MyEdge*>& getEdges() { return edges; };
Run Code Online (Sandbox Code Playgroud)

并获取Endpoints声明为:

const std::pair<MyNode*, MyNode*>& getEndpoints() { return nodes; };
Run Code Online (Sandbox Code Playgroud)

我得到的编译器错误是:

MyGraph.cpp:63: error: request for member `getEndpoints' in 
`*(&sit)->std::_Rb_tree_const_iterator<_Tp>::operator-> …
Run Code Online (Sandbox Code Playgroud)

c++ iterator const

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