我知道编译器无法确定不完整对象的大小,因此 MAKE_ARRAY_RANGE 失败。MAKE_ARRAY_RANGE 执行 sizeof 操作。
我该怎么做才能让这个工作。一种方法是让我在 Ah 中指定 A_array[3] 的大小 但问题是有人可以修改 A.cpp 而不是更新 Ah 中的索引
A_array 的大小是否可以(不完全)传递给 MACRO(有点像变量参数宏),然后 MAKE_ARRAY_RANGE 将使用该信息并保持其当前功能。我对 MACRO 的经验很少,在这方面对这个问题的帮助会很棒。
如何将 make_array.h 中定义的 MACRO 和类修改为 MAKE_ARRAY_RANGE?
A.h
----------------------
#ifndef INC_A_H
#define INC_A_H
#include "make_array.h"
extern const int A_array[];
extern const int_array_range my_array;
#endif
----------------------
A.cpp
----------------------
#include "make_array.h"
#include "A.h"
const int A_array[] = {10, 20, 30};
----------------------
B.cpp
----------------------
#include <iostream>
#include "A.h"
#include "make_array.h"
int main()
{
const int_array_range my_array = MAKE_ARRAY_RANGE(A_array);
const int *curr = my_array.first; // Accessing std::pair first
const int *last = my_array.second; // Accessing std::pair second
for(curr; curr!=last; curr++)
{
std::cout << *curr << "\n";
}
int x;
std::cin >> x;
return 0;
}
----------------------
make_array.h
----------------------
#ifndef INC_MAKE_ARRAY_H
#define INC_MAKE_ARRAY_H
#include <iostream>
#include <map>
#define ARRAY_SIZE( my_array ) (sizeof(my_array)/sizeof((my_array)[0]))
template< typename Array_Entry>
class ARRAY_RANGE : public std::pair<Array_Entry*,Array_Entry*>
{
public:
ARRAY_RANGE() : std::pair<Array_Entry*,Array_Entry*>( 0, 0 ) {}
ARRAY_RANGE( Array_Entry *start, Array_Entry *end ) : std::pair<Array_Entry*,Array_Entry*>( start, end ) {}
};
template< typename Array_Entry>
ARRAY_RANGE<Array_Entry> make_array_range( Array_Entry *start, Array_Entry *end )
{
return ARRAY_RANGE<Array_Entry>( start, end );
}
#define MAKE_ARRAY_RANGE( my_array )\
make_array_range( (my_array)+0, (my_array) + ARRAY_SIZE( my_array ) )
typedef ARRAY_RANGE<const int> int_array_range;
#endif
输出:
1>projects\test_extern\test_extern\b.cpp(7): error C2070: 'const int []': illegal sizeof operand