【发布时间】:2020-02-16 20:47:31
【问题描述】:
我有一些涉及static const uint64_t 值的代码,我试图将其用作位集。问题是,当我使用 MSVC 编译它时,我收到错误 "initializer is not a constant"。但是,当我使用 MSVC 编译代码并将文件重命名为 .cpp 时,它可以正常工作。另外,如果我在 Windows 10 上使用 gcc 编译它,它也可以正常工作。
代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
// A 52 card deck can be represented in a bit set.
typedef uint64_t PokerCardSet;
// individal cards
// -------------------------------
static const PokerCardSet HEARTS_A = (PokerCardSet)1 << 0;
static const PokerCardSet HEARTS_2 = (PokerCardSet)1 << 1;
static const PokerCardSet HEARTS_3 = (PokerCardSet)1 << 2;
static const PokerCardSet HEARTS_4 = (PokerCardSet)1 << 3;
static const PokerCardSet HEARTS_5 = (PokerCardSet)1 << 4;
static const PokerCardSet HEARTS_6 = (PokerCardSet)1 << 5;
static const PokerCardSet HEARTS_7 = (PokerCardSet)1 << 6;
static const PokerCardSet HEARTS_8 = (PokerCardSet)1 << 7;
static const PokerCardSet HEARTS_9 = (PokerCardSet)1 << 8;
static const PokerCardSet HEARTS_10 = (PokerCardSet)1 << 9;
static const PokerCardSet HEARTS_J = (PokerCardSet)1 << 10;
static const PokerCardSet HEARTS_Q = (PokerCardSet)1 << 11;
static const PokerCardSet HEARTS_K = (PokerCardSet)1 << 12;
static const PokerCardSet HEARTS_SUIT = HEARTS_A |
HEARTS_2 |
HEARTS_3 |
HEARTS_4 |
HEARTS_5 |
HEARTS_6 |
HEARTS_7 |
HEARTS_8 |
HEARTS_9 |
HEARTS_10 |
HEARTS_J |
HEARTS_Q |
HEARTS_K;
我认为应该没问题的是,HEARTS_SUIT 仅由其他常量组成。所以我不确定为什么我只用 MSVC 得到这个并将它编译为 C 文件。
这是我得到的确切错误
poker.c(69): error C2099: initializer is not a constant
第 69 行是 HEARTS_SUIT 行,但我删除了一些其他出现相同错误的代码,以便更快地阅读和理解。
我的 MSVC 版本是:
Microsoft (R) C/C++ Optimizing Compiler Version 19.16.27032.1 for x64
对于 MSVC 和 C 有没有办法解决这个问题?还是我必须将卡值切换为宏?
【问题讨论】:
-
见stackoverflow.com/questions/30962512/…。这是 GCC 的“许可”行为并且严格不符合。请注意,MSVC 上的 C 编译是 ISO C90 - 虽然这不是这里的具体问题,但会导致大量现代 C 代码在任何情况下都无法编译。
-
@Clifford 是有道理的,但为什么它可以与具有相同代码的
.cpp文件的 MSVC 一起使用? MSVC 是否使用比 C 更高的默认 C++ 标准? -
因为C++是不同的语言,两者的const语义不同。
标签: c visual-c++