在C++ IS的C.1.3(2003.它也在C++ 11 IS中),该标准指出了ISO C和C++之间的差异; 即,为
char arr[100];
Run Code Online (Sandbox Code Playgroud)
sizeof(0, arr)以C语言返回sizeof(char*),但100在C++中.
我找不到sizeof两个参数的文档.明显的后备是逗号运算符,但我不这么认为:sizeof(arr)在C中100; sizeof(0, arr)是sizeof(char*).两个sizeof(0, arr)和sizeof(arr)是100在C++中.
在这种情况下,我可能会忽略IS的重点.有人可以帮忙吗?这类似于09年讨论的问题,但没有人提到IS,我认为没有给出正确的答案.
编辑:实际上,IS正在谈论逗号运算符.因此,出于某种原因,在C中(0, arr)返回a char*,但char[100]在C++中返回a .为什么?
我正在研究一些C代码,它在设置DEBUG标志时会执行大量的错误报告和日志记录,这有时会在未设置标志的情况下生成未使用的变量警告DEBUG.
#ifdef DEBUG
#define CHECK(expr) foo(expr)
#else
#define CHECK(expr)
#endif /* DEBUG */
int x = bar(a, b, c); /* bar has to be called for both DEBUG begin defined and undefined */
CHECK(x == SOME_VALUE); /* Produces an "unused variable" warning if DEBUG is undefined
Run Code Online (Sandbox Code Playgroud)
编辑:只是一点提醒(不确定是否有任何后果):CHECK宏的参数是表达式,而不是单个变量.
对于这种模式,摆脱未使用的变量警告的最佳方法是什么?
我尝试了什么:
#ifdef DEBUG
int x = bar(a, b, c);
#else
bar(a, b, c);
#endif
CHECK(x == SOME_VALUE);
Run Code Online (Sandbox Code Playgroud)
然后,避免bar两次写入调用(在实际调用中更复杂): …
使用起来安全吗,此代码使用gcc 4.9.2编译,没有任何错误或警告
widget *p;
...
p = malloc(sizeof *p);
Run Code Online (Sandbox Code Playgroud)
我在SEI CERT C编码标准网站上找到了它。
单击此处 -没有类型不匹配的问题,无需强制转换。您每次分配正确的内存量。
struct widget;
typedef struct widget widget_t;
struct gadget;
typedef struct gadget gadget_t;
widget_t *newWidget(void)
{
widget_t *p = malloc(sizeof *p);
if (p)
/* initialize members of *p as necessary */
return p;
}
gadget_t *newGadget(void)
{
gadget_t *p = malloc(sizeof *p);
if (p)
/* initialize members of *p as necessary */
return p;
}
void deleteWidget(widget_t **p)
{
/* delete any …Run Code Online (Sandbox Code Playgroud)