固定サイズのベクトル/行列に作用するライブラリ(つまり、関数の集合)を構築したいと考えています。ライブラリに触れずに、この固定サイズをメインファイルに指定したいと思います。私は#define
を使ってこれを行うことができましたが、私はこのアプローチを「正しい」方法ではなくハックと見ています。この目標を達成するために他にどのようなアプローチが必要ですか?このアイデアは、一度ライブラリを書いてから、一度も触れないようにしたり、もう一度見たりすることです。ここで#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
//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.cpp
//helper.cpp
#include "helper.h"
void test_function1(void) {
std::cout << "Hello world!\n";
return;
}
void print_vector(unsigned int my_vector[helper_max_size], const unsigned int my_size) {
for (unsigned int i=0;i<my_size;++i) {
std::cout << my_vector[i] << " ";
}
std::cout << "\n";
return;
}
は、プログラムはで構成する必要があります1つの翻訳単位のみです。つまり、行に沿ってコンパイルする必要があります。
g++ -o program program.cpp helper.h helper.cpp
関連:
How do I use extern to share variables between source files?
Declare array size in header file without #define's
「プログラムは、単一の変換ユニットで構成する必要があり、すなわち、それが線に沿ってコンパイルされなければなりません」。 – tkausl
あなたはC++を使い始めることができます;)...例えば、あなたの行列型テンプレートを(サイズをパラメータにして)作成します。もしあなたが固定サイズの配列を持っていれば、あなたは 'std :: array'をどうにか使ってください。 – user463035818