Tag: 语言 律师

将首先评估表达式的右侧

右侧是否会一直评估在左侧之前? 然后右侧的结果将传递到左侧。 我不是在谈论A[i]=i++等exception 我说的是正常情况: A[i] = (j+32+43 & K); A[j] != (A[j] + A[k]); 首先评估所有这些表达式的正确部分,然后将结果与左侧进行比较? (总是)

任何编译器都通过memcpy / memmove传输有效类型

根据N1570 6.5 / 6: 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是复制值的对象的有效类型(如果有)。 这表明即使在“long”和其他整数类型具有相同表示的系统上,以下内容也会调用未定义的行为: #if ~0UL == ~0U #define long_equiv int #elif ~0UL == ~0ULL #define long_equiv long long #else #error Oops #endif long blah(void) { long l; long_equiv l2; long_equiv *p = malloc(sizeof (long)); l = 1234; memcpy(p, &l, sizeof (long)); l2 = *p; free(p); // Added to address complaint about leak […]

为什么fgets接受int而不是size_t?

strcpy() , malloc() , strlen()和其他各种函数接受它们的参数或返回值作为size_t而不是int或unsigned int ,原因很明显。 某些文件函数(如fread()和fwrite()使用size_t 。 通过扩展,可以预期char* fgets (char *str, int num, FILE *stream)应该使用size_t而不是int作为其缓冲区大小的参数。 但是, fgets()使用int 。 有客观解释为什么?

C长型是多久?

我知道标题看起来很愚蠢,但我认为这值得一提。 以此声明(或定义,可能)为例: _Thread_local long volatile static int _Atomic const long unsigned x = 10; 我曾经认为long long是一个类型,但如果它是一个类型名称,那么如何插入这么多限定符呢? 所以我用这个问题咨询了N1570,只是为了更加困惑。 它提到了一些术语,如“ 类型说明符 ”和“ 类型限定符 ”,我在“类型说明符”中找不到多long long ,但在C中不long long的原始类型? 有这么多书告诉我了! 澄清不重复: 是的,我看到一个现有的问题涉及long int long ,但这个问题与限定符有关,并且在C中。

POSIX线程被“暂停”是什么意思?

在对最近一个问题的评论过程中,出现了一个附属问题,即在什么时候可以预期对具有可取消性PTHREAD_CANCEL_DEFERRED的pthreads线程的取消请求起作用。 随后提到了标准和一些律师。 我并不太关心我在这个问题的评论中是否错了,但我想确保我正确理解POSIX的规定。 标准中最相关的部分说 每当线程启用了可取消性并且已经以该线程作为目标取消请求,然后线程调用任何作为取消点的函数时,取消请求将在函数返回之前被执行。 如果线程启用了可取消性并且在线程作为目标进行了取消请求,而线程在取消点处被挂起,则线程应被唤醒并且取消请求将被执行。 但是,线程被“暂停”是什么意思呢? POSIX明确定义了进程的术语,但就我而言,并没有为线程定义。 另一方面,POSIX将线程暂停作为少数函数的行为之一,包括但不限于与同步对象相关的一些函数。 是否应该得出结论认为那些集体作为该术语的相关定义? 鉴于POSIX没有将线程暂停指定为read() , fread()或任何常规文件或流I / O函数的行为的一部分,因此这一切都与产生此查询行的问题有关,如果一个post因I / O被阻止而没有进展,这是否意味着它被“暂停”以便取消?

静态变量声明(C)

以下两个static变量声明是否相同? 1。 static int var1; static int var2; static int var3; 2。 static int var1, var2, var3; 更具体地说,在情况2中,所有变量都是static ,还是只是var1 ?

为什么我可以在gcc -std = c11中使用gets()?

gets()函数已从C语言中删除。 标准中不存在此类function。 然而,我编译以下代码: #include int main (void) { (void) gets (NULL); } 运用 gcc -std=c11 -pedantic-errors -Wall -Wextra 它编译时不会出现任何错误或警告。 同样的, #include int gets; int main (void) {} 不会编译(错误:’获得’重新声明为不同类型的符号)。 在标准4.一致性§6中,我们可以阅读: 符合条件的实现可能具有扩展(包括附加库函数),前提是它们不会改变任何严格符合程序的行为 鉴于上述情况,我认为即使在迂腐模式下,gcc也不符合标准。 是否有一个原因? 这是故意还是错误? GCC版本4.9.1。 编辑: gcc –version gcc (x86_64-win32-seh-rev1, Built by MinGW-W64 project) 4.9.1

声明和原型的区别

C语句中的声明和原型有什么区别? 在哪些情况下,它们被称为声明和原型?

我们可以将va_arg与工会一起使用吗?

6.7.2.1我的C99标准草案第14段有关于工会和指针的说法(强调,一如既往地增加): 联合的大小足以容纳其中最大的成员。 最多一个成员的值可以随时存储在union对象中。 指向适当转换的并集对象的指针指向其每个成员(或者如果成员是位字段,则指向它所在的单位),反之亦然。 一切都很好,这意味着执行类似下面的操作是合法的,将signed或unsigned int复制到union中,假设我们只想将其复制到相同类型的数据中: union ints { int i; unsigned u; }; int i = 4; union ints is = *(union ints *)&i; int j = is.i; // legal unsigned k = is.u; // not so much 7.15.1.1第2段有这样的说法: va_arg宏扩展为具有指定类型的表达式和调用中下一个参数的值。 参数ap应该由va_start或va_copy宏初始化(没有为va_copy调用va_end宏)。 每次调用va_arg宏都会修改ap以便依次返回连续参数的值。 参数type应该是指定的类型名称,以便可以通过将*到type来获得指向具有指定类型的对象的指针的type 。 如果没有实际的下一个参数, 或者type与实际的下一个参数的类型不兼容(根据默认参数提升而提升),则行为是未定义的,除了以下情况: -one type是有符号整数类型,另一种类型是相应的无符号整数类型,并且该值可在两种类型中表示; -one类型是指向void的指针,另一个是指向字符类型的指针。 我不打算引用关于默认参数促销的部分。 我的问题是:这是定义的行为: void func(int i, […]

一个对象可以有多个有效类型吗?

在ABI不向联合插入填充的平台上考虑以下代码: union { int xi; } x; x.xi = 1; 我相信第二行显示未定义的行为,因为它违反了严格的别名规则: x.xi引用的对象与x引用的对象是同一个对象。 两者都是相同的存储区域,术语对象在ISO 9899:2011§3.15中定义为: 宾语 执行环境中的1个数据存储区域,其内容可以表示值 2注意引用时,对象可能被解释为具有特定类型; 见6.3.2.1。 由于对象不仅仅是一个存储区域,我得出结论,由于x和x.xi占用相同的存储空间,因此它们是同一个对象。 x的有效类型是union { int xi; } 因为它是声明的类型。 见§6.5¶6: 6访问其存储值的对象的有效类型是对象的声明类型(如果有)。 87)如果通过具有非字符类型的左值的值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及后续访问的有效类型修改存储的值。 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是复制值的对象的有效类型(如果有)。 对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。 87)分配的对象没有声明的类型。 根据¶6的措辞,显然每个对象只能有一种有效类型。 在x.xi语句中,我通过lvalue x.xi typed int访问x 。 这不是§6.5¶7中列出的类型之一: 7对象的存储值只能由具有以下类型之一的左值表达式访问: 88) 与对象的有效类型兼容的类型, 与对象的有效类型兼容的类型的限定版本, 与对象的有效类型对应的有符号或无符号类型的类型, 与有效类型的对象的限定版本对应的有符号或无符号类型的类型, 在其成员中包含上述类型之一的聚合或联合类型(包括递归地,子聚合或包含联合的成员),或者 一个字符类型。 88)此列表的目的是指定对象可能或可能没有别名的情况。 因此,第二行表现出不确定的行为。 由于这种解释显然是错误的,我在哪里误读标准?