c - 2 个类似的 C 程序,宏产生不同的输出

标签 c gcc macros

以下代码不打印任何内容:

#include<stdio.h>
#define TOTAL_SIZE ( (sizeof(array))/(sizeof(array[0])) )
int main()
{
    int array[]={1,2,3}, d;
    for(d=-1; d<=TOTAL_SIZE-2; ++d)
    {
        printf("%d\n", array[d+1]);
    }
    return 0;
}

d=-1 <=3-2
打印 array[-1+1] 即 array[0]
d=0 <=3-2
打印 array[0+1] 即 array[1]
d=1 <=3-2
打印 array[1+1] 即 array[2]

但是连一个元素都没有打印出来!



但是这段代码产生打印数组中所有元素的正确输出:

#include<stdio.h>
#define TOTAL_SIZE ( (sizeof(array))/(sizeof(array[0])) )
int main()
{
    int array[]={1,2,3}, d;
    for(d=0; d<=TOTAL_SIZE-1; ++d)
    {
        printf("%d\n", array[d]);
    }
    return 0;
}

但是两个循环的净效果似乎是一样的。

如果我们将宏 TOTAL_SIZE 替换为数组中的元素数,它就会起作用。所以问题似乎出在宏上。

但是当我尝试打印由 TOTAL_SIZE 生成的值时,它打印了正确的值。

第一个程序有什么问题?

最佳答案

您的宏的问题是 sizeof 返回一个 size_t,它是您正在与 比较的无符号整数类型已签名 int。解决方案是将您的大小转换为 int

#define TOTAL_SIZE (int)( (sizeof(array))/(sizeof(array[0])) )

关于c - 2 个类似的 C 程序,宏产生不同的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42318293/

相关文章:

c++ - 海湾合作委员会警告 "dereferencing type-punned pointer will break strict-aliasing rules"

c++ - 在 Code::blocks 上设置 CLANG 3.4

macros - clojure - 以非普通方式扩展类型

c - 使用 C 预处理器生成多个相似的函数

使用cmake编译并链接两个文件?

c - OpenGL 在使用使用它制作的 dll 时给出异常

c - 从 ANSI C 代码获取控制流图

macros - 使用宏创建新标识符

c - 使用 c 静态链接 libcurl

c - 如何修改此程序以计算非空格字符的数量?