Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 让编译器声明并定位调试指针变量_C_Unit Testing_Pointers_Initialization - Fatal编程技术网

C 让编译器声明并定位调试指针变量

C 让编译器声明并定位调试指针变量,c,unit-testing,pointers,initialization,C,Unit Testing,Pointers,Initialization,假设我有两个函数,如下所示: unsigned char PlusTwo(unsigned char value) { return (value + 2); } unsigned char PlusTwoUsingPtr(unsigned char *value) { return (*value + 2); } 如果我想在开发过程中测试第一个函数,没问题,我所要做的就是: PlusTwo(8); 编译器会自动为我在内存中的某个地方放置一个常量。然而,为了测试第二个函数,它

假设我有两个函数,如下所示:

unsigned char PlusTwo(unsigned char value)
{
    return (value + 2);
}
unsigned char PlusTwoUsingPtr(unsigned char *value)
{
    return (*value + 2);
}
如果我想在开发过程中测试第一个函数,没问题,我所要做的就是:

PlusTwo(8);
编译器会自动为我在内存中的某个地方放置一个常量。然而,为了测试第二个函数,它变得更加复杂。首先我必须声明一个变量,然后将变量的地址传递给函数:

unsigned char eight = 8;
PlusTwoUsingPtr(&eight);

这并不十分耗时,但很烦人(尤其是在C89/ANSI中,函数块的位置)。有没有什么技巧可以让我只在一行代码中测试这个函数,让编译器声明并放置一个常量,让我指向它?

你可以使用标量类型的复合文字:

 PlusTwoUsingPtr(&((unsigned char){8}));
复合文字是C99中引入的一项功能。
有关信息,对象是可变的(具有静态存储持续时间),您也可以在函数中修改它。

指向隐式创建的对象的指针不会剪切它。根据它的签名,
PlusTwoUsingPtr
写入
*值
,这是完全合理的(即使没有强制转换和UB等)。。。这似乎奏效了。8是像文本字符串一样存储的吗?@Robert否,它也有静态存储持续时间,但它是可修改的。而且GCC似乎支持它,即使没有明确使用C99标准,因为它是GCC对C89的默认扩展的一部分。@JAB-Nice!这是我的下一个问题。你不需要在复合文字周围加括号,
&(unsigned char){8}
就可以了。