我一直想知道为什么你不能使用本地定义的类作为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中声明一个数组时,你就是声明一个指针并为它所指向的序列分配空间.
但这让我感到困惑:以下代码:
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中的某种语法糖,它在编译时只是转换为指针的东西吗?
我有
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)
为什么?
我已经看到了几个浮动数组长度的宏:
从这个问题:
#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)
我想知道的是:
array[0]和有*array什么区别?我最近发现了一些这样的代码:
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找到静态数组大小 -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); …在重构代码并摆脱我们现在被教导讨厌的所有#defines时,我偶然发现了这个用于计算结构中元素数量的美:
#define STRUCTSIZE(s) (sizeof(s) / sizeof(*s))
Run Code Online (Sandbox Code Playgroud)
非常有用,但是它可以转换为内联函数或模板吗?
好的,ARRAYSIZE会是一个更好的名字,但这是遗留代码(不知道它来自哪里,至少15年)所以我按原样粘贴它.
假设我有一个叫做的宏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**.
声明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)