相关疑难解决方法(0)

拒绝指针的数组大小的宏

经常教授的标准数组大小的宏是

#define ARRAYSIZE(arr) (sizeof(arr) / sizeof(arr[0]))
Run Code Online (Sandbox Code Playgroud)

或一些等效的形成.然而,当传入指针时,这种事情会默默地成功,并且在运行时看起来似乎有道理,直到事情神秘地分崩离析.

犯这个错误太容易了:一个具有局部数组变量的函数被重构,将一些数组操作移动到一个以数组作为参数调用的新函数中.

所以,问题是:是否有一个"卫生"宏来检测ARRAYSIZEC中宏的滥用,最好是在编译时?在C++中,我们只使用专门用于数组参数的模板; 在C中,似乎我们需要一些方法来区分数组和指针.(例如,如果我想拒绝数组,我只是(arr=arr, ...)因为数组赋值是非法的).

c arrays macros c-preprocessor

49
推荐指数
4
解决办法
1万
查看次数

最有用的用户自制C-宏(在GCC中,也是C99)?

您认为哪种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 macros c99 c-preprocessor

28
推荐指数
8
解决办法
1万
查看次数

C中是否有一个标准函数可以返回数组的长度?

C中是否有一个标准函数可以返回数组的长度?

c arrays

24
推荐指数
3
解决办法
8654
查看次数

不使用宏编译时间sizeof_array

这只是过去几天困扰我的事情,我认为不可能解决,但我之前看过模板魔术.

开始:

为了获得标准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++ puzzle metaprogramming

16
推荐指数
5
解决办法
1万
查看次数

C中是否有数组大小/长度的快捷方式?

有没有办法加快在C中获取数组大小?

sizeof(array)/sizeof(int)每次打字都会变老.任何C库都有类似的东西.length或是否有某种方式可以定义sizeof(array)/sizeof(int)为某种较短的常量(也可能使用点表示法)?

c arrays

6
推荐指数
2
解决办法
1309
查看次数

C++中C库的范围 - <Xh> vs <cX>

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++ gcc gnu

5
推荐指数
2
解决办法
1181
查看次数

创建一个函数以返回 C 中 int 数组的长度

我是 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 arrays function

5
推荐指数
1
解决办法
1124
查看次数

为什么C中没有数组长度函数?

虽然有多种方法可以在C中查找数组的长度,但语言不提供一种.

在C或其任何修订中不包括这种共同操作的原因是什么?

c arrays

3
推荐指数
1
解决办法
4632
查看次数

C++ unsigned char数组长度

我在我的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是一个可以在程序执行期间改变大小的数组.任何人都可以帮助我如何写它.谢谢

c++ linux uart

2
推荐指数
1
解决办法
3773
查看次数

标签 统计

c ×6

arrays ×5

c++ ×3

c-preprocessor ×2

macros ×2

c99 ×1

function ×1

gcc ×1

gnu ×1

linux ×1

metaprogramming ×1

puzzle ×1

uart ×1