相关疑难解决方法(0)

使用STL算法的本地类

我一直想知道为什么你不能使用本地定义的类作为STL算法的谓词.

在问题:接近STL算法,lambda,本地类和其他方法,BubbaT提到" 由于C++标准禁止将本地类型用作参数 "

示例代码:

int main() {
   int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
   std::vector<int> v( array, array+10 );

   struct even : public std::unary_function<int,bool>
   {
      bool operator()( int x ) { return !( x % 2 ); }
   };
   std::remove_if( v.begin(), v.end(), even() ); // error
}
Run Code Online (Sandbox Code Playgroud)

有谁知道标准中的限制在哪里?禁止当地类型的理由是什么?


编辑:从C++ 11开始,使用本地类型作为模板参数是合法的.

c++ stl stl-algorithm

50
推荐指数
2
解决办法
5645
查看次数

在C中,是数组指针还是用作指针?

我的理解是数组只是指向一系列值的常量指针,当你在C中声明一个数组时,你就是声明一个指针并为它所指向的序列分配空间.

但这让我感到困惑:以下代码:

char y[20];
char *z = y;

printf("y size is %lu\n", sizeof(y));
printf("y is %p\n", y);
printf("z size is %lu\n", sizeof(z));
printf("z is %p\n", z);
Run Code Online (Sandbox Code Playgroud)

使用Apple GCC编译时会得到以下结果:

y size is 20
y is 0x7fff5fbff930
z size is 8
z is 0x7fff5fbff930
Run Code Online (Sandbox Code Playgroud)

(我的机器是64位,指针长8个字节).

如果'y'是常量指针,为什么它的大小为20,就像它指向的值序列一样?变量名'y'是否在编译时被内存地址替换为适当的?那么数组是C中的某种语法糖,它在编译时只是转换为指针的东西吗?

c arrays pointers

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

如何找到int []的大小?

我有

int list[] = {1, 2, 3};
Run Code Online (Sandbox Code Playgroud)

如何获得大小list

我知道对于char数组,我们可以strlen(array)用来查找大小,或者'\0'在数组末尾检查.


我尝试sizeof(array) / sizeof(array[0])了一些答案,但它只适用于主?例如:

int size(int arr1[]){
    return sizeof(arr1) / sizeof(arr1[0]);
}

int main() {
    int list[] = {1, 2, 3};

    int size1 = sizeof(list) / sizeof(list[0]); // ok
    int size2 = size(list_1); // no
    // size1 and size2 are not the same
}
Run Code Online (Sandbox Code Playgroud)

为什么?

c++ arrays

43
推荐指数
6
解决办法
16万
查看次数

C的常见数组长度宏?

我已经看到了几个浮动数组长度的宏:

这个问题:

  • #define length(array) (sizeof(array)/sizeof(*(array)))
  • #define ARRAY_LENGTH(array) (sizeof((array))/sizeof((array)[0]))
  • #define SIZE(array, type) (sizeof(array) / (sizeof(type))

和Visual Studio的_countof:

#define _countof(_Array) (sizeof(_Array) / sizeof(_Array[0]))
Run Code Online (Sandbox Code Playgroud)

我想知道的是:

  1. 那些使用array[0]和有*array什么区别?
  2. 为什么要首选?
  3. 它们在C++方面有区别吗?

c c++ arrays c-preprocessor

32
推荐指数
2
解决办法
3万
查看次数

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

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

c arrays

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

有关引用数组参数的用处是什么?

我最近发现了一些这样的代码:

typedef int TenInts[10];
void foo(TenInts &arr);
Run Code Online (Sandbox Code Playgroud)

你能做些什么foo()是有用的,如果宣言是:

void foo(int *arr);    // or,
void foo(int arr[]);   // or,
void foo(int arr[10]); // ?
Run Code Online (Sandbox Code Playgroud)

我发现了一个问题,询问如何传递对数组的引用.我猜我在问为什么.

此外,只有一个答案 "何时指向数组的指针有用?" 讨论了函数参数,所以我不认为这是一个重复的问题.

c++ arrays pass-by-reference

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

静态数组的大小

我声明一个静态char数组,然后我将它传递给一个函数.怎么得到没有.函数内部数组中的字节数?

c++ arrays size

14
推荐指数
3
解决办法
3万
查看次数

C找到静态数组大小(防止错误)

查找静态数组的大小是一种常见操作.看:C找到静态数组大小 -sizeof(a) / sizeof((a)[0])

这可以包装成一个宏,例如:

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

但是它可能会意外地传入常规指针.

例如: void func(SomeArray **foo) { int i = ARRAY_SIZE(foo); }

虽然它的有效C,但往往最终成为一个逻辑错误.

它可以防止这种错误(利用每个处理器在零长度位域上失败).


#define ARRAY_SIZE(a) \
    ((sizeof(struct { int isnt_array : \
     ((const void *)&(a) == &(a)[0]); }) * 0) + \
     (sizeof(a) / sizeof(*(a))))
Run Code Online (Sandbox Code Playgroud)

我发现这个宏适用于GCC,但是对于间接引用的成员,它与Clang失败了.同error: expression is not an integer constant expression

例如:

  • char word[8]; int i = ARRAY_SIZE(word); 好.
  • struct Bar { word[8]; }
    void func(struct Bar *foo) { int i = ARRAY_SIZE(foo->word); …

c arrays c-preprocessor

14
推荐指数
1
解决办法
852
查看次数

这个宏可以转换为函数吗?

在重构代码并摆脱我们现在被教导讨厌的所有#defines时,我偶然发现了这个用于计算结构中元素数量的美:

#define STRUCTSIZE(s) (sizeof(s) / sizeof(*s))
Run Code Online (Sandbox Code Playgroud)

非常有用,但是它可以转换为内联函数或模板吗?

好的,ARRAYSIZE会是一个更好的名字,但这是遗留代码(不知道它来自哪里,至少15年)所以我按原样粘贴它.

c++ macros c-preprocessor

8
推荐指数
3
解决办法
3613
查看次数

C++:sizeof表示数组长度

假设我有一个叫做的宏LengthOf(array):

sizeof array / sizeof array[0]
Run Code Online (Sandbox Code Playgroud)

当我制作一个23号的新阵列时,我不应该回来23 LengthOf吗?

WCHAR* str = new WCHAR[23];
str[22] = '\0';
size_t len = LengthOf(str); // len == 4
Run Code Online (Sandbox Code Playgroud)

为什么len == 4

更新:我做了一个错字,这是一个WCHAR*,而不是一个WCHAR**.

c++ macros

3
推荐指数
2
解决办法
3515
查看次数

sizeof abuse:获取const表的大小

声明const表时,可以使用sizeof获取表的大小.但是,一旦停止使用符号名称,它就不再起作用了.有没有办法让以下程序输出表A的正确大小,而不是0?

#include <stdio.h>

struct mystruct {
    int a;
    short b;
};

const struct mystruct tableA[] ={
    { 
        .a = 1,
        .b = 2,
    },
    { 
        .a = 2,
        .b = 2,
    },
    { 
        .a = 3,
        .b = 2,
    },
};

const struct mystruct tableB[] ={
    { 
        .a = 1,
        .b = 2,
    },
    { 
        .a = 2,
        .b = 2,
    },
};


int main(int argc, char * argv[]) {
    int tbl_sz;
    const struct mystruct * table;

    table = tableA; …
Run Code Online (Sandbox Code Playgroud)

c sizeof

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