错误C2070-未指定外部数组大小.-数组传递给MACRO

error C2070 - extern array size not specified. - array passed to MACRO

本文关键字:数组 MACRO C2070- 未指定 外部 错误      更新时间:2023-10-16

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

  1. 我该怎么做才能让它工作。一种方法是我在A.h中指定A_array[3]的大小。但问题是,有人可能正在修改A.cpp,而没有对A.h 中的索引进行更新

  2. A_array的大小是否可以(不完全)传递给MACRO(某种程度上类似于变量参数宏),然后MAKE_ARAY_RANGE将使用该信息并维护其当前功能。我对MACRO的经验很少,在这方面帮助解决这个问题会很好。

如何将make_array.h中定义的MACRO和类修改为make_ARAY_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>projectstest_externtest_externb.cpp(7): error C2070: 'const int []': illegal sizeof operand

您可以添加

extern const size_t A_array_size;

至A.h和

const size_t A_array_size = sizeof(A_array);

到A.cpp,然后在MAKE_ARRAY_RANGE-宏中使用A_array_size。例如:

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

虽然这解决了你上面描述的问题,但我怀疑这是否能解决你真正的问题。你不能用std::list or std::vector吗?