我需要运行Linux CLI命令并从C获取其stdout输出.
我可以使用pipe()创建一个管道,然后使用fork/exec,在调用exec()之前将child的stdout描述符重定向到管道,并从父管道中读取.另外,我需要等孩子.
是否有一个简单的调用fork + redirect + exec + wait,就像system()执行fork + exec + wait一样,只有system()不执行重定向.
有popen(),它执行fork + redirect + exec,但是没有等待,所以我无法获得退出状态.
我在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) 由于某些不可理解的原因,在我的代码中,我有类似的内容:
#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 背景自学 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"
,或者只是编译器弄清楚如何从字符串字节中获取符文?