相关疑难解决方法(0)

sizeof有两个论点

在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 c++ arrays pointers comma-operator

37
推荐指数
5
解决办法
2333
查看次数

如何优雅地修复这个未使用的变量警告?

我正在研究一些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两次写入调用(在实际调用中更复杂): …

c macros unused-variables

6
推荐指数
1
解决办法
798
查看次数

不是使用sizeof(type),而是使用sizeof * p,它安全又正确吗?

使用起来安全吗,此代码使用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)

c malloc

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

标签 统计

c ×3

arrays ×1

c++ ×1

comma-operator ×1

macros ×1

malloc ×1

pointers ×1

unused-variables ×1