Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在不依赖#define的情况下向前声明数组大小?_C++_C++11_Forward Declaration - Fatal编程技术网

C++ 如何在不依赖#define的情况下向前声明数组大小?

C++ 如何在不依赖#define的情况下向前声明数组大小?,c++,c++11,forward-declaration,C++,C++11,Forward Declaration,我想建立一个作用于固定大小的向量/矩阵的库(即函数集合)。我希望在主文件中指定此固定大小,而不接触库。我可以通过使用#define来实现这一点,但我认为这种方法是一种技巧,而不是“正确”的方法。我还有什么其他方法来实现这个目标?这个想法是写一次图书馆,然后再也不碰它,甚至不再看它 下面是一个玩具示例program.cpp //program.cpp -- Definition of my_external_constant here const unsigned int array_size =

我想建立一个作用于固定大小的向量/矩阵的库(即函数集合)。我希望在主文件中指定此固定大小,而不接触库。我可以通过使用
#define
来实现这一点,但我认为这种方法是一种技巧,而不是“正确”的方法。我还有什么其他方法来实现这个目标?这个想法是写一次图书馆,然后再也不碰它,甚至不再看它

下面是一个玩具示例program.cpp

//program.cpp -- Definition of my_external_constant here
const unsigned int array_size = 10;
#define my_external_constant array_size // I am looking for alternatives.
#include "helper.h"

int main(int argc, char* argv[]) {

    test_function1();

    unsigned int X[array_size];
    X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0;
    print_vector(X,3);

    return 0;
}
然后是助手

//helper.h
#ifndef HELPER_H
#define HELPER_H

#include<iostream>

#ifndef my_external_constant    // I want to avoid this...
#define my_external_constant 1  //...and this...
#endif                          //...and this.

void test_function1(void);

//The library uses helper_max_size everywhere, and its value is inherited from outside.
const unsigned int helper_max_size = my_external_constant;
void print_vector(unsigned int[helper_max_size], const unsigned int);

#endif /* HELPER_H */

相关的:

我希望在主文件中指定此固定大小,而不接触库

这个想法是写一次图书馆,然后再也不碰它,甚至不再看它

在数组大小上参数化库中的所有实用程序和函数。例如:

// helper.h
template <std::size_t N>
void print_vector(unsigned int(&array)[N], const unsigned int) { /* ... */ }

//program.cpp
#包括
#包括“helper.h”
constexpr std::size\u t array\u size=10;
int main(int argc,char*argv[])
{
测试功能1();
std::数组X;
X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0;
打印向量(X,3);
}
我希望在主文件中指定此固定大小,而不接触库

这个想法是写一次图书馆,然后再也不碰它,甚至不再看它

在数组大小上参数化库中的所有实用程序和函数。例如:

// helper.h
template <std::size_t N>
void print_vector(unsigned int(&array)[N], const unsigned int) { /* ... */ }

//program.cpp
#包括
#包括“helper.h”
constexpr std::size\u t array\u size=10;
int main(int argc,char*argv[])
{
测试功能1();
std::数组X;
X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0;
打印向量(X,3);
}

“程序”应该只由一个翻译单元组成,即它应该沿“行”的方式编译:“仍然有多个翻译单元,你可以开始使用C++;…………例如,制作矩阵类型模板(尺寸参数化)。如果你有固定大小的数组,你应该使用<代码> STD::数组无论如何,程序应该只由一个翻译单元组成,即它应该沿着线编译:“仍然有多个翻译单元。你可以开始使用C++;…………例如,制作矩阵类型模板(尺寸参数化)。如果您有固定大小的数组,您应该使用
std::array
无论如何,我想指出的是,直接将作为函数参数传递的原始数组替换为
std::array
:现在整个数组将按值传递(复制),而原始代码只传递一个原始指针(可能是无意中,因为它看起来像数组)。更好的方法是通过const引用传递。我应该看看这个,谢谢你的回答!我想提到直接用
std::array
替换作为函数参数传递的原始数组的危险:现在整个数组都将通过值传递(复制)而原始代码只传递一个原始指针(可能是无意中,因为它看起来像数组)。更好的方法是通过常量引用传递它。我应该看看这个,谢谢你的回答!
// helper.h
template <std::size_t N>
void print_vector(unsigned int(&array)[N], const unsigned int) { /* ... */ }
// program.cpp 
#include <cstddef>
#include "helper.h"

constexpr std::size_t array_size = 10;

int main(int argc, char* argv[]) 
{
    test_function1();

    unsigned int X[array_size];
    X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0;
    print_vector(X, 3);
}
// helper.h
template <std::size_t N>
void print_vector(const std::array<unsigned int, N>& array, const unsigned int) 
{ 
    /* ... */ 
}
// program.cpp 
#include <cstddef>
#include "helper.h"

constexpr std::size_t array_size = 10;

int main(int argc, char* argv[]) 
{
    test_function1();

    std::array<unsigned int, array_size> X;
    X[0]=500;X[1]=0;X[2]=9;X[3]=111;X[4]=0;
    print_vector(X, 3);
}