我是TDD的新手,我发现RegExp非常特殊.是否有任何特殊的单元测试方法,或者我可以将它们视为常规功能?
使用VLA(可变长度数组)有一些奇怪的代码,它被gcc 4.6视为有效C(C99,C11):
$ cat a.c
int main(int argc,char**argv)
{
struct args_t{
int a;
int params[argc]; // << Wat?
// VLA in the middle of some struct, between other fields
int b;
} args;
args.b=0;
for(args.a=0;args.a<argc;args.a++)
{
args.params[args.a]=argv[0][0];
args.b++;
}
return args.b;
}
Run Code Online (Sandbox Code Playgroud)
此代码编译时没有警告:
$ gcc-4.6 -Wall -std=c99 a.c && echo $?
0
$ ./a.out ; echo $?
1
$ ./a.out 2; echo $?
2
$ ./a.out 2 3; echo $?
3
Run Code Online (Sandbox Code Playgroud)
同样的-std=c1x:
$ gcc-4.6 -Wall -std=c1x a.c && …Run Code Online (Sandbox Code Playgroud) 在阅读C代码时,我经常遇到如下语句:
int rc = foo(bar,baz);
assert(rc!= NULL);
其中变量rc用于检查函数的返回值.我认为这是某种形式的助记符,但无法推断其含义.
我想知道它的含义,以帮助我理解代码.
我有一个函数返回一个union类型.是否允许标准(C99)直接从调用访问返回值的字段而不将值复制到变量.这里有一个例子来说明我的意思:
union thinga { int integ; char arr[4]; };
union thinga f(void)
{
union thinga t = {.integ = 1};
return t;
}
int main(void)
{
printf("thinga is %d\n", f().integ);
}
Run Code Online (Sandbox Code Playgroud)
是否f().integ允许使用字段调用?在我的例子中它是一个,union但问题是相同的struct.我问这个问题,因为我清楚地记得Solaris上的gcc 3.3并不喜欢这种结构,并会像地狱一样警告.它的问题是它必须在内部生成一个不可见的变量,以便能够访问struct或者的字段union.较新的编译器似乎不介意构造,但我想知道是否有隐藏的捕获(即undefined bevaviour我没有想到.
编辑:好吧,看起来我的设计实例有点过于简单,并且通过将数组衰减的链接指向超出范围对象的指针注意到评论者2501,让我们看看如果我改变了我的代码,我们是否处于相同的情况.
union thinga f(const char *val)
{
union thinga t = {.integ = 0};
t.arr[0] = val[0];
return t;
}
int main(void)
{
printf(" thinga.integ=%d .arr=%s\n", f("1").integ, f("1").arr);
}
Run Code Online (Sandbox Code Playgroud)
这种情况与非左值和序列点限制和 …
我正在编写一个访问函数,它返回一个指向内部缓冲区的指针,我想向我的函数用户暗示他们不应该更新指向的对象.一个非常人为的例子是:
void myAccessFunc(bool string, void* p, size_t* len)
{
static const char* s = "aha!";
static const int i = 123;
if (string) {
*(char**)p = &s;
*len = strlen(s);
}
else {
*(int**)p = &i;
*len = sizeof(i);
}
}
char* s;
size_t bytes;
myAccessFunc(true,&s, &bytes);
printf("Got '%s'\n", s);
Run Code Online (Sandbox Code Playgroud)
是的,我知道这看起来很好看.
我想要防止的是:
char* s;
size_t bytes;
myAccessFunc(true,&s,&bytes);
s[4] = '?';
Run Code Online (Sandbox Code Playgroud)
我知道我不能完全阻止它但我至少喜欢编译器警告提示用户他们不应该这样做.如果他们投了我的指针,那就是他们的问题.有没有const和void的组合和*会这样做?我尝试过类似的东西:
void myAccessFunc(bool string, const void** p, size_t* len);
Run Code Online (Sandbox Code Playgroud)
但它似乎消除了指针的无效性,因此调用者必须这样做:
const void* p;
size_t bytes;
myAccessFunc(true, &p, &bytes);
Run Code Online (Sandbox Code Playgroud)
要么
const …Run Code Online (Sandbox Code Playgroud)