0

我知道编译器无法确定不完整对象的大小,因此 MAKE_ARRAY_RANGE 失败。MAKE_ARRAY_RANGE 执行 sizeof 操作。

  1. 我该怎么做才能让这个工作。一种方法是让我在 Ah 中指定 A_array[3] 的大小 但问题是有人可以修改 A.cpp 而不是更新 Ah 中的索引

  2. 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
4

1 回答 1

3

你可以添加一个

extern const size_t A_array_size;

对啊和

const size_t A_array_size = sizeof(A_array);

到 A.cpp 然后A_array_size在你的MAKE_ARRAY_RANGE-macro 中使用。比如像这样:

#define ARRAY_SIZE( my_array ) (my_array ## _size) / sizeof((my_array)[0]))

虽然这解决了您上面描述的问题,但我怀疑这会解决您的实际问题。你不能用std::list or std::vector吗?

于 2013-02-14T11:18:03.517 回答