Tag: 编码式

简写typedef指向常量结构的指针

使用typedef声明结构 typedef struct some_struct { int someValue; } *pSomeStruct; 然后使用const声明将它作为参数传递给某个函数,暗示’const some_struct * var’ void someFunction1( const pSomeStruct var ) 结果变成了 some_struct * const var 这也在ISO C标准的第6.7.5.1节中说明,该标准指出在这种情况下’const’适用于指针而不适用于它指向的数据。 所以问题是 – 有没有办法用typedef用shortended表示法声明一个const结构的指针,或者必须总是有一个特殊的单独声明: typedef const struct some_struct *pcSomeStruct; void someFunction2( pcSomeStruct var )

C中的按位索引?

我正在尝试实现我已经拥有的数据压缩思想,并且因为我想要在大量的测试数据库中运行它,我曾想过用C语言编写代码(我主要有像Ruby这样的脚本语言的经验。 TCL)。 通过关于C的O’Reilly’牛’书,我意识到我不能简单地索引一个简单的’char’或’int’类型变量的位,因为我想做按位比较和运算符。 我认为这是正确的吗? 使用枚举类型表示一个位(并创建这些数组,并编写函数转换为char和从char转换)是否合理? 如果是这样,是否已在某个标准库中定义了这样的类型和函数? 还有其他(更好的?)方法吗? 是否有人可以指向我的某些示例代码? 谢谢 –

快速输入输出function

#define getcx getchar_unlocked inline void inp( int &n )//fast input function { n=0; int ch=getcx();int sign=1; while( ch ‘9’ ){if(ch==’-‘)sign=-1; ch=getcx();} while( ch >= ‘0’ && ch <= '9' ) n = (n<<3)+(n<<1) + ch-'0', ch=getcx(); n=n*sign; } 嗨我一直在使用上述函数在各种编码竞赛中输入,但从来没有能够理解为什么它快。 我知道逻辑,但不知道它的坚牢度的概念。 例如,这行是做什么的“#define getcx getchar_unlocked”。 另外我不知道任何快速输出function,所以还有任何快速输出function

将预处理程序指令缩进为emacs中的C代码

默认情况下,Emacs不会缩进预处理器代码。 我知道它的历史根源已经过时了。 但是,拥有大量#ifdef unindented的代码很难阅读。 所以我想让emacs自动缩进给我这样的东西: void myfunc() { int foo; #ifdef BAR printf(foo); #endif return foo; } 而不是我现在得到的: void myfunc() { int foo; #ifdef BAR printf(foo); #endif return foo; } 这个问题的任何线索你emacs黑客:)?

关于在C族语言中使用有符号整数

在我自己的代码中使用整数值时,我总是试着考虑签名,问自己整数应该是有符号还是无符号。 当我确定该值永远不需要为负数时,我会使用无符号整数。 而且我不得不说这种情况大多数时间都会发生。 在阅读其他人的代码时,我很少看到无符号整数,即使代表的值不能为负数。 所以我问自己: “这有充分的理由吗,或者人们只是使用签名整数,因为不关心» ? 我在这里和其他地方搜索了这个主题,我不得不说,当它适用时,我找不到使用无符号整数的充分理由。 我遇到了这些问题: «默认int类型:有符号或无符号?»和« 你应该总是对C中的数字使用’int’,即使它们是非负的吗? »这两个都提供以下示例: for( unsigned int i = foo.Length() – 1; i >= 0; –i ) {} 对我来说,这只是糟糕的设计。 当然,它可能会导致无限循环,无符号整数。 但是在循环之前检查foo.Length()是否为0是如此困难? 所以我个人认为这不是一直使用有符号整数的好理由。 有些人也可能会说有符号整数可能很有用,即使对于非负值,也可能提供错误标记,通常为-1 。 好吧,拥有一个特定值意味着“错误”是件好事。 但是,对于那个具体的价值,像UINT_MAX这样的东西有什么问题呢? 我实际上是在问这个问题,因为它可能会导致一些巨大的问题,通常在使用第三方库时。 在这种情况下,您经常需要处理有符号和无符号值。 大多数情况下,人们只是不关心签名,只是将一个unsigned int分配给signed int ,而不检查范围。 我不得不说我对编译器警告标志有点偏执 ,所以在我的设置中,这样的隐式转换将导致编译器错误。 对于那种东西,我通常使用函数或宏来检查范围,然后使用显式转换分配,如果需要则引发错误。 这对我来说似乎合乎逻辑。 作为最后一个例子,因为我也是Objective-C开发人员(请注意,此问题仅与Objective-C无关): – ( NSInteger )tableView: ( UITableView * )tableView numberOfRowsInSection: ( […]

使用#ifndef #define #endif对C头文件进行最佳练习

关于以下“模式”的最佳实践是什么? #ifndef BLAFOO_H #define BLAFOO_H /* … * … */ #endif /* BLAFOO_H */ 我该如何命名#define指令中的标题? 我见过所有从BLAFOO_H到__BLAFOO_H到_BLAFOO_H_等。

如何在C中使用作为struct成员的指针?

我不是C编程的新手。 但是我不明白将指针作为C中的结构成员保持指示是有用的。例如 // Fist Way: To keep pointer to function in struct struct newtype{ int a; char c; int (*f)(struct newtype*); } var; int fun(struct newtype* v){ return v->a; } // Second way: Simple struct newtype2{ int a; char c; } var2; int fun2(struct newtype2* v){ return v->a; } int main(){ // Fist: Require two […]

顺便读取内存:“signed char *”vs“unsigned char *”

人们经常需要一次一个字节地读取内存,就像在这个天真的memcpy()实现中一样: void *memcpy(void *dest, const void *src, size_t n) { char *from = (char *)src; char *to = (char *)dest; while(n–) *to++ = *from++; return dest; } 但是,我有时会看到人们显式使用unsigned char *而不仅仅是char * 。 当然, char和unsigned char可能不相等。 但是,当按字节读/写内存时,我是否使用char * , signed char *或unsigned char *有所不同吗? 更新:实际上,我完全清楚c=200可能有不同的值,具体取决于c的类型。 我在这里问的是为什么人们在读取内存时有时会使用unsigned char *而不是char * ,例如为了在char[4]存储uint32_t 。

旧式C函数声明

这是一个简单的函数delcared并使用旧样式语法定义: #include void error(message,a1,a2,a3,a4,a5,a6,a7) char *message; char *a1,*a2,*a3,*a4,*a5,*a6,*a7; { fprintf(stderr,message,a1,a2,a3,a4,a5,a6,a7); } int main () { error(“[ERROR %d]: %s.\n”,110,”Connection timed out”); return 0; } 它可以编译并正确运行以进行打印: [ERROR 110]:连接超时。 我读到这个样式没有相关的原型,但是如何在运行时自动将int转换为char *,甚至提供的参数少于声明的参数?

为清晰起见,是否应使用返回类型的无用类型限定符?

当我们在头文件中有原型时,我们的静态分析工具会抱怨“返回类型上无用的类型限定符”,例如: const int foo(); 我们这样定义它是因为函数返回一个永远不会改变的常量,认为API似乎更清晰。 我觉得这类似于为了清楚明确地将全局变量初始化为零,即使C标准已经声明如果未明确初始化所有全局变量将被初始化为零。 在一天结束时,它真的没关系。 (但静态分析工具并没有抱怨。) 我的问题是,有什么理由可以导致问题吗? 我们是否应该忽略该工具产生的错误,或者我们是否应该以不太清晰和一致的API的可能成本来安抚该工具? (它返回该工具没有问题的其他const char*常量。)