C代码在C++代码中使用时失去常态

C代码在C++代码中使用时失去常态,c++,C++,我有一个C/C++混合项目,我目前正在工作。我有一个全局常数C代码,我想从C++脚本和C脚本中访问。在这种特殊情况下,我尝试使用一个C++数组,它由C全局常量代码中定义的常数整数组成的可变维数。然而,当我尝试使用或声明这个数组时,我得到了一个错误,即数组维度不是整数常量,尽管我在C代码中将它们定义为整数常量 常数c const int x = 5; 常数.h #ifdef __cplusplus extern "C" { #endif extern const int x; #ifdef

我有一个C/C++混合项目,我目前正在工作。我有一个全局常数C代码,我想从C++脚本和C脚本中访问。在这种特殊情况下,我尝试使用一个C++数组,它由C全局常量代码中定义的常数整数组成的可变维数。然而,当我尝试使用或声明这个数组时,我得到了一个错误,即数组维度不是整数常量,尽管我在C代码中将它们定义为整数常量

常数c

const int x = 5;
常数.h

#ifdef __cplusplus
extern "C" {
#endif

extern const int x;

#ifdef __cplusplus
}
#endif
我的cpp.h

#include "constants.h"

my_cpp.cpp

#include "my_cpp.h"

double A[x];

所以在这里,我会得到一个错误,声明x不是一个整数常量。哪里出错了?

您没有将x的定义放在头文件中,因此它不是一个核心常量表达式

最简单的修复方法是使用const int x=5;在头文件中。或者,您可以使用enum:enum{x=5;}-这会提供真正的prvalue,非常类似于文字5本身


<>在C++中,关于C++中的常量表达式和数组索引的常数信息需要在C++中找到常量表达式:

,你没有把X的定义放在头文件中,所以它不是核心常量表达式。 最简单的修复方法是使用const int x=5;在头文件中。或者,您可以使用enum:enum{x=5;}-这会提供真正的prvalue,非常类似于文字5本身



<> > C++中的常数表达式和数组索引中的常数表达式需要在C++中找到常量表达式:

C++编译器将const变量看作编译时常数,需要查看包含初始化的完整定义。如果看不到,则该变量是一个运行时常量,不能用作数组大小。@jdhabez:是否涉及编译器错误消息?如果没有,模块是否成功链接?也许我会出错。。。实际上,我是不是犯了一个错误?这里有一些代码显示使用const int是很好的-即使VLAs禁用了:这是一个纯C++问题。C中的const int不是整数常量表达式,不能使用它作为静态数组维数。与所问的问题有些无关,但我仍然认为重要的是C或C++源代码文件通常不被称为脚本。对于C++编译器来说,将const变量看作编译时常数,需要查看包含初始化的完整定义。如果看不到,则该变量是一个运行时常量,不能用作数组大小。@jdhabez:是否涉及编译器错误消息?如果没有,模块是否成功链接?也许我会出错。。。实际上,我是不是犯了一个错误?这里有一些代码显示使用const int是很好的-即使VLAs禁用了:这是一个纯C++问题。C中的const int不是整数常量表达式,不能使用它作为静态数组维数。与所问的问题有些无关,但我仍然认为重要的是C或C++源代码文件通常不被称为脚本,这可能会混淆。好的,如果我在CPP头文件中这样做的话,我可以让它工作。但是,我希望在一个地方对该值进行硬编码,而不是在该值发生更改时在多个文件中查找该值。@MilesBudnek,除非使用ODR,但我不想用ODR打开这整罐蠕虫,因为OP没有询问它,更愿意谈论它。@jdhabez在多个位置的值是多少?同一个变量不能初始化两次。@Quimby我在一个专用于全局常量的C脚本中初始化了它。常量整数存储在那里。有人告诉我,我将无法使用它们来声明数组dimmensions,因此现在我需要创建一个新的const int,它与我的C常量脚本中的const int保持相同的值,以便在我的CPP脚本中使用。。。。这意味着,如果需要更改,我有两个硬编码变量要更改,而不是在我的C常量代码中只有一个硬编码变量要更改。@jdhabez否,建议的是将定义从constants.C移到constants.h,而不是复制它。@SergeyA-Hmm,是的,这样,如果我在CPP头文件中这样做,我就可以让它工作。但是,我希望在一个地方对该值进行硬编码,而不是在该值发生更改时在多个文件中查找该值。@MilesBudnek,除非使用ODR,但我不想用ODR打开这整罐蠕虫,因为OP没有询问它,更愿意谈论它。@jdhabez在多个位置的值是多少?同一个变量不能初始化两次。@Quimby我在一个专用于全局常量的C脚本中初始化了它。常量整数存储在那里。我被告知我将不能使用tho
为了声明数组dimmensions,现在我需要创建一个新的const int,它与我的C常量脚本中的const int保持相同的值,以便在我的CPP脚本中使用。。。。这意味着如果需要更改,我有两个硬编码变量要更改,而不是在我的C常量代码中只有一个硬编码变量要更改。@jdhabez否,建议将定义从常数.C移到常数.h,而不是复制它。