小编Rem*_*o.D的帖子

获取管道中的命令输出,C代表Linux

我需要运行Linux CLI命令并从C获取其stdout输出.

我可以使用pipe()创建一个管道,然后使用fork/exec,在调用exec()之前将child的stdout描述符重定向到管道,并从父管道中读取.另外,我需要等孩子.

是否有一个简单的调用fork + redirect + exec + wait,就像system()执行fork + exec + wait一样,只有system()不执行重定向.

有popen(),它执行fork + redirect + exec,但是没有等待,所以我无法获得退出状态.

c linux api pipe process

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

Microsoft Visual Studio 2010中的C预处理程序问题

我在VS 2010中遇到了新的Visual C++问题.

我有一个带有以下定义的标题:

#define STC(y) #y
#define STR(y) STC(\y)
#define NNN(y) 0##y
#define NUM(y) NNN(y)
Run Code Online (Sandbox Code Playgroud)

意图是你可以有一些常数

#define TOKEN x5A
Run Code Online (Sandbox Code Playgroud)

然后你可以将令牌作为数字或字符串:

NUM(TOKEN) -> 0x5A
STR(TOKEN) -> "\x5A"
Run Code Online (Sandbox Code Playgroud)

这是宏参数替换规则下的预期行为,到目前为止它在VS2008 Express中与gcc,open watcom,pellesC(lcc),Digital Mars C和Visual C++一起运行良好.

今天我用VS2010 Express重新编译了库,发现它不再起作用了!使用新版本我会得到:

NUM(TOKEN) -> 0x5A
STR(TOKEN) -> "\y"
Run Code Online (Sandbox Code Playgroud)

似乎新的预处理器\y甚至在宏体内处理为转义序列,这是无意义的,因为转义序列在文字字符串中只有意义.

我怀疑这是ANSI标准的灰色区域,但即使原始行为是由标准规定的,MS VC++也不是100%符合ANSI C标准,因此我想我将不得不忍受新的行为. MS编译器.

鉴于此,是否有人建议如何使用VS2010重新实现原始宏行为?

编辑:更正了NUM()

编辑:可能的解决方案

我想我已经找到了办法:

#define STC(y) #y

#if defined(_MSC_VER) && (_MSC_VER >= 1600)
#define STA(x,y) STC(x##y)
#define STR(y) STA(\,y)
#else 
#define STR(y) STC(\y)
#endif

#define NNN(y) 0##y
#define …
Run Code Online (Sandbox Code Playgroud)

c visual-studio-2010 visual-c++

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

类似函数的宏和变量

由于某些不可理解的原因,在我的代码中,我有类似的内容:

#define pippo(x) printf("%d",x)
...
... many lines down in the code
...
int pippo = 0;
Run Code Online (Sandbox Code Playgroud)

相同的标识符pippo已用于类似函数的宏和变量名称!除了在糟糕的维护者中可能出现的混乱之外,我想知道这是否符合标准。

C99 和 C11(在 6.10.3. 中)都说:

10 [...] 类似函数的宏名称的每个后续实例后跟一个 ( 作为下一个预处理标记引入预处理标记序列,该序列被定义中的替换列表替换 [...]

他们没有说明如果类似函数的宏名称后面没有'('会发生什么,我担心某些编译器可能会认为这是一个错误(或者可能只是发出警告)。

我是不是太担心了?

c c-preprocessor

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

从字符串到符文切片的转换是否会复制?

我正在从 C 背景自学 Go。下面的代码按我的预期工作(前两个Printf()将访问字节,后两个Printf()将访问代码点)。

我不清楚的是这是否涉及任何数据复制。

package main

import "fmt"

var a string

func main() {
    a = "èe"
    fmt.Printf("%d\n", a[0])
    fmt.Printf("%d\n", a[1])
    fmt.Println("")
    fmt.Printf("%d\n", []rune(a)[0])
    fmt.Printf("%d\n", []rune(a)[1])
}
Run Code Online (Sandbox Code Playgroud)

换句话说:

确实[]rune("string")创建了一个符文数组并用对应的符文填充它"string",或者只是编译器弄清楚如何从字符串字节中获取符文?

go rune

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

标签 统计

c ×3

api ×1

c-preprocessor ×1

go ×1

linux ×1

pipe ×1

process ×1

rune ×1

visual-c++ ×1

visual-studio-2010 ×1