Tag: 类型

如果C有指针,为什么C需要数组呢?

如果我们可以使用指针和malloc来创建和使用数组,为什么数组类型存在于C中? 如果我们可以使用指针而不是没有必要吗?

什么是C中的bogus_type

我一直在浏览libgcc中定义的一些类型。 它们显然都映射到名为bogus_type的相同类型。 我找不到它的定义。 #define SItype bogus_type #define USItype bogus_type #define DItype bogus_type #define UDItype bogus_type #define SFtype bogus_type #define DFtype bogus_type 这种类型映射到什么? 它甚至是一个有效的类型或类似NULL东西?

C类型命名约定,_t或ALLCAPS

我一直想知道是否有任何命名对象,如何使用ALLCAPS作为类型以及何时追加_t (何时不使用任何东西?)。 我知道K&R早些时候发布了有关如何使用C的各种文档,但我找不到任何关于此的内容。 在C标准库类型中, _t似乎占据主导地位 time_t clock_t uint32_t size_t sig_atomic_t … ,而不是FILE , va_list或struct tm 。 实际上有规则还是完全随意的? Microsoft总是在他们的Windows API中使用ALLCAPS中的类型名称,至少看起来比C库更加一致,坦率地说……

如何编写C函数接受任何类型的(一个)参数

我正在为C中的列表实现简单的库,我在编写find函数时遇到了问题。 我希望我的函数接受任何类型的参数来查找, find(my_list, 3) :my find(my_list, 3)和find(my_list, my_int_var_to_find) 。 我已经掌握了列表元素类型的信息 。 现在我已经找到了几种解决这个问题的方法: 带有不同类型后缀的不同函数: int findi(void* list, int i) , int findd(void* list, double d) – 但我不喜欢这种方法,对我来说似乎是冗余,而且API令人困惑。 使用联盟: typedef union { int i; double d; char c; … } any_type; 但是这样我强制用户既知道any_type联合,又在调用find之前创建它。 我想避免这种情况。 使用variadic函数: int find(void* list, …) 。 我喜欢这种方法。 但是,我担心没有对参数数量的限制。 用户可以自由编写int x = find(list, 1, 2.0, […]

C中基本数据类型的大小

我有一个示例程序,我从一些网站复制。 int main(void) { int answer; short x = 1; long y = 2; float u = 3.0; double v = 4.4; long double w = 5.54; char c = ‘p’; typedef enum { kAttributeInvalid, kBooleanAttributeActive, kBooleanAttributeAlarmSignal, kBooleanAttributeAlign64, kBooleanAttributeAutoNegotiationComplete, }codes_t; /* __DATE__, __TIME__, __FILE__, __LINE__ are predefined symbols */ #if 0 printf(“Date : %s\n”, __DATE__); […]

在C中编写宏时,如何找到参数的类型和printf说明符?

我想用宏来扩展minunit更有用。 #define mu_assert_equal(actual, expected) do { \ if (actual != expected) { \ char *message = malloc(MAX_ERROR_MESSAGE_LENGTH); \ if (message == NULL) { printf(“malloc failed”); exit(1); } \ snprintf(message, MAX_ERROR_MESSAGE_LENGTH, “required: %s != %s, reality: %s == %lu”, \ #actual, #expected, #actual, actual); \ return message; \ } \ } while (0) 调用: mu_assert_equal(bytes_parsed, 1); […]

从C创建一个实现__dict__的Python类型?

根据“正常”类创建的__dict__类型是如何在Python中定义的? 有没有__dict__ s的非动态类型的例子? 通过Python的type_new定义的类型是否通过type_new ? tp_dict有一个tp_dict成员,但我找不到有关如何使用它的信息。 在typeobject.c的type_new似乎也有一些事情发生,但我无法清楚地解读它。 以下是我发现的一些相关信息: inheritance自C扩展模块的类中的__dict__ 如何在Python中实现__slots__?

如何使两个相同的指针类型不兼容

在某些体系结构上,可能需要为其他相同的对象使用不同的指针类型。 特别是对于哈佛架构CPU,您可能需要以下内容: uint8_t const ram* data1; uint8_t const rom* data2; 特别是这对于PICs的MPLAB C18(现已停产)中ROM / RAM指针的定义如何。 它甚至可以定义如下内容: char const rom* ram* ram strdptr; 这意味着RAM中的指针指向RAM中指向ROM中的字符串的指针(使用ram是没有必要的,因为默认情况下这个编译器在RAM中,为了清楚起见,只是添加了所有内容)。 这种语法的好处是编译器能够在您尝试以不兼容的方式分配时提醒您,例如ROM位置的地址到指向RAM的指针(类似于data1 = data2;或传递ROM)使用RAM指针指向函数的指针会产生错误)。 与此相反,在AVR-8的avr-gcc中,没有这种类型的安全性,因为它提供了访问ROM数据的function。 无法将指向RAM的指针与指向ROM的指针区分开来。 在某些情况下,这种类型的安全性对于捕获编程错误非常有益。 有没有办法以某种方式向指针添加类似的修饰符(例如通过预处理器,扩展到可以模仿这种行为的东西)来实现此目的? 甚至是一些警告不正当访问的东西? (在avr-gcc的情况下,尝试在不使用ROM访问function的情况下获取值)

最小的数据类型 – 我可以定义一位变量吗?

我只需要一位来表示我的数据 – 1或0.在C中这样做的最佳方法是什么? “正常”数据类型太大。

我如何在C中将类型的变量更改为另一个?

我要做: int main () { bla bla bla void *onetype; switch (USER_INPUT_TYPE) { CASE CONVERT_TO_CHAR: convert onetype VOID TO CHAR >>> HOW??? CASE CONVERT_TO_INT: convert onetype VOID TO INT >>> HOW??? LOT OF CASES… } } 是的,我知道类型转换,但类型转换是一种“临时”改变。 那么,有没有办法在C中完成它? 编辑: 停止停止! 请看,你在做什么是类型转换,我知道,你正在创建另一个所需类型的变量,如int i =(int)onetype,我不想要这个,我想要其他像onetype =(int )ontyype,无需重新创建它们,无需分配另一个变量。 非常感谢!