gpt4 book ai didi

c++ - C 与 C++ 为什么这个宏不扩展为常量?

转载 作者:行者123 更新时间:2023-12-02 01:52:47 24 4
gpt4 key购买 nike

我正在使用 gcc/g++。下面的代码使用gcc -S test.c可以正常编译,但是使用g++ -S test.cpp我得到错误:请求的对齐不是整数常量。如果我查看两者的预处理器输出,它看起来是相同的。所以我的问题是,在 C++ 情况下,为什么预处理器不将 ALIGN_BYTES 计算为常量 64? (如果我用常量 64 替换 ALIGN_BYTES ,它就可以正常工作)

/* test.c, test.cpp */
#define BITS 512
#define ALIGN_BYTES (BITS / 8)

#define ALIGN __attribute__ ((aligned(ALIGN_BYTES)))

typedef char* ALIGN char_PT;

最佳答案

这不是宏扩展问题。此处,宏在 C 或 C++ 中均未扩展为常量。预处理器不执行算术运算,因此它只是生成表达式 512/8,它不是常量,但编译器绝对应该能够将其减少到 1。

预处理器在这里为 C 和 C++ 生成相同的代码,但 GCC(由于我不明白的原因)在两种语言中以不同的方式对待 __attribute__ 扩展。我真的不知道为什么,可能有充分的理由,但其他人必须解释这一点。

如果你编译 C,gccaligned((512/8)) 很满意,但如果你用 g++ 编译 C++会提示 512/8 不是常量。我想这是对的,但实际上也是错的。

在其他情况下,情况恰恰相反,g++ 对非常数感到满意,但 gcc 则不然。例如,如果您声明一个static const int,则可以在 C++ 中的 __attribute__((aligned(...)) 中使用它,但不能在 C 中使用它。同样,我不能解释一下原因。它是一个编译器扩展,GCC 可以做任何事情。由于某种原因,它会在这里以不同的方式对待这两种语言。

/* g++ will complain about this one; gcc will not */
typedef char *__attribute__((aligned((512 / 8)))) char_PT;

/* gcc will complain about this one; g++ will not */
static const int A = 16;
typedef char *__attribute__((aligned(A))) char_PT2;

不过,我想,既然我们知道一个版本适用于 C,另一个版本适用于 C++,我们可以这样做:

#define BITS 512

#ifdef __cplusplus
static const unsigned int ALIGN_BYTES = BITS / 8;
#define ALIGN __attribute__((aligned(ALIGN_BYTES)))
#else /* C */
#define ALIGN_BYTES (BITS / 8)
#define ALIGN __attribute__((aligned(ALIGN_BYTES)))
#endif

typedef char *ALIGN char_PT;

关于c++ - C 与 C++ 为什么这个宏不扩展为常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70013032/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com