【问题标题】:define constant int/char* in .cpp在 .cpp 中定义常量 int/char*
【发布时间】:2018-04-26 14:25:39
【问题描述】:

我的项目使用version.h来配置应用程序版本,很多源文件都包括这个version.h,目前它定义了应用程序版本,如:

#define VERSION 1

每次升级到新版本,我都需要修改这个VERSION,而且因为它包含在所有的源文件中,所以整个项目都要重新编译,这需要很长时间。

所以我想把它拆分成.h.cpp。然后我只是在更新时修改.cpp,它只重新编译一个文件。

这是我尝试过的:

test.cpp

#include <iostream>
using namespace std;

const static int VERSION;

// some other source code that uses the version
struct traits {
    const static int ver = VERSION; 
};

int main() {
    cout << traits::ver << endl; 

}

version.cpp

const int VERSION = 1;

请注意,我需要将其用作静态。但是编译不出来,报错:

错误 C2734: 'VERSION': 'const' 对象必须初始化,否则 '外部'

错误 C2131:表达式未计算为常量

注意:失败是由非常量参数或引用 非常数符号

注意:查看“版本”的用法

定义版本代码的最佳方式是什么?

环境:Visual Studio 2015 更新 3

【问题讨论】:

  • 欺骗是你想要做的。在 C++17 中有inline variables。您应该始终包含错误消息。
  • 这个问题显示了编译时间常数大写的习惯是如何产生的,以及为什么这是坏习惯。
  • “请注意,我需要将它用作静态”不,你不需要。
  • 您可以将 version 设为一个函数,然后自动生成 cpp 文件(在您选择的构建系统中),该函数只返回一个常量。那么当版本发生变化时,header保持不变,只是cpp文件发生变化。

标签: c++ static constants


【解决方案1】:

version.h

extern const int VERSION;

version.cpp

#include "version.h"

extern const int VERSION = 1;

test.cpp

#include "version.h"

struct traits {
    const static int ver;
};
const int traits::ver = VERSION;

wandbox

【讨论】:

  • version.cpp 也应该使用#include "version.h"
  • VERSION 应该是const
  • @MarkRansom 为什么?即使它只包含外部?
  • 确保定义和声明兼容。这不是绝对必要的,只是良好的做法。会发现@Jarod42 指出的问题。
【解决方案2】:

我正在使用类似的东西。

我的 version.cpp 看起来像:

const int SoftwareVersion = 0xAA55A55A;

要使用版本号(如 main.cpp 中的示例),它看起来像:

...
extern const int SoftwareVersion;
...
int main(int argc, char **args) {
  printf("Version %i\n",SoftwareVersion);
}

【讨论】:

    猜你喜欢
    • 2018-12-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多