经常教授的标准数组大小的宏是
#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)
或一些等效的形成.然而,当传入指针时,这种事情会默默地成功,并且在运行时看起来似乎有道理,直到事情神秘地分崩离析.
犯这个错误太容易了:一个具有局部数组变量的函数被重构,将一些数组操作移动到一个以数组作为参数调用的新函数中.
所以,问题是:是否有一个"卫生"宏来检测ARRAYSIZEC中宏的滥用,最好是在编译时?在C++中,我们只使用专门用于数组参数的模板; 在C中,似乎我们需要一些方法来区分数组和指针.(例如,如果我想拒绝数组,我只是(arr=arr, ...)因为数组赋值是非法的).
您认为哪种C宏最有用?我找到了以下一个,用于在C中进行矢量运算:
#define v3_op_v3(x, op, y, z) {z[0]=x[0] op y[0]; \
z[1]=x[1] op y[1]; \
z[2]=x[2] op y[2];}
Run Code Online (Sandbox Code Playgroud)
它的工作方式如下:
v3_op_v3(vectorA, +, vectorB, vectorC);
v3_op_v3(vectorE, *, vectorF, vectorJ);
...
Run Code Online (Sandbox Code Playgroud) 这只是过去几天困扰我的事情,我认为不可能解决,但我之前看过模板魔术.
开始:
为了获得标准C++数组中的元素数量,我可以使用宏(1)或类型安全的内联函数(2):
(1)
#define sizeof_array(ARRAY) (sizeof(ARRAY)/sizeof(ARRAY[0]))
Run Code Online (Sandbox Code Playgroud)
(2)
template <typename T>
size_t sizeof_array(const T& ARRAY){
return (sizeof(ARRAY)/sizeof(ARRAY[0]));
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,第一个问题是成为一个宏(目前我认为是一个问题),而另一个问题是在编译时无法获得数组的大小; 即我不能写:
enum ENUM{N=sizeof_array(ARRAY)};
Run Code Online (Sandbox Code Playgroud)
要么
BOOST_STATIC_ASSERT(sizeof_array(ARRAY)==10);// Assuming the size 10..
Run Code Online (Sandbox Code Playgroud)
有谁知道这是否可以解决?
更新:
这个问题是在引入constexpr之前创建的.现在你可以简单地使用:
template <typename T>
constexpr auto sizeof_array(const T& iarray) {
return (sizeof(iarray) / sizeof(iarray[0]));
}
Run Code Online (Sandbox Code Playgroud) 有没有办法加快在C中获取数组大小?
sizeof(array)/sizeof(int)每次打字都会变老.任何C库都有类似的东西.length或是否有某种方式可以定义sizeof(array)/sizeof(int)为某种较短的常量(也可能使用点表示法)?
C++编程语言:特别版在第431页说明......
For every header < X.h > defining part of the C standard library in the global namespace and also in namespace std, there is a header < cX > defining the same names in the std namespace only.
但是,当我在<cX>样式中使用C头时,我不需要限定命名空间.例如...
#include <cmath>
void f() {
double var = sqrt( 17 );
}
Run Code Online (Sandbox Code Playgroud)
这将编译好.虽然本书说使用<cX>标头仅定义std命名空间中的名称,但您可以使用这些名称而不限定命名空间.我在这里错过了什么?
PS使用GNU.GCC编译器
我是 C 编程新手。我想创建一个函数,它将整数数组作为参数并返回数组的长度。我知道下面的代码可以正确计算长度。
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]);
Run Code Online (Sandbox Code Playgroud)
但是,如果我创建如下所示的函数并将数组作为参数传递,则它不起作用。
int length_of(int* arr) {
return sizeof(arr) / sizeof(arr[0]);
}
Run Code Online (Sandbox Code Playgroud)
我的猜测是我没有正确地将数组传递到函数中。实现这个的正确方法是什么?
虽然有多种方法可以在C中查找数组的长度,但语言不提供一种.
在C或其任何修订中不包括这种共同操作的原因是什么?
我在我的C++程序中有六进制值的unsigned char数组:
unsigned char buff[] = {0x03, 0x35, 0x6B};
Run Code Online (Sandbox Code Playgroud)
我想计算这个数组的大小,以便我可以使用这个函数在UART端口linux上发送它:
if ((count = write(file,buff,length))<0)
{
perror("FAIL to write on exit\n");
}
Run Code Online (Sandbox Code Playgroud)
因为我可以看到长度是int数,buff是一个可以在程序执行期间改变大小的数组.任何人都可以帮助我如何写它.谢谢