小编Joh*_*zem的帖子

当两者都是32位宽时,在C(或C++)中使用`unsigned long`和`unsigned int`是否存在可观察到的差异?

我正在使用带有编译器的MPC56XX(嵌入式系统),其中a int和a long都是32位宽.

在必需的软件包中,我们对32位宽类型有以下定义:

typedef   signed int sint32;
typedef unsigned int uint32;
Run Code Online (Sandbox Code Playgroud)

在一个新版本中,没有太多文档就改变了:

typedef   signed long sint32;
typedef unsigned long uint32;
Run Code Online (Sandbox Code Playgroud)

我可以看出为什么这会是一件好事:整数在short和之间有转换等级long,所以理论上在使用第一组定义时可以应用额外的转换.

我的问题:鉴于包裹作者强加给我们的上述变化,是否存在可以想象的情况,这种变化会改变编译的代码,正确导致不同的结果?

我熟悉"通常的一元转换"和"通常的二进制转换",但我很难想出一个具体的情况,这可能会破坏我现有的代码.但它真的无关紧要吗?

我目前正在使用C89/C94在纯C环境中工作,但我对C和C++问题都很感兴趣.

编辑:我知道混合intsint32可能会产生不同的结果重新定义.但我们不允许直接使用原始的C类型,只允许使用typedef类型.
我正在寻找一个样本(表达式或片段)使用常量,一元/二元运算符,强制转换等,根据更改的类型定义,使用不同但正确的编译结果.

c c++ language-lawyer implicit-conversion

9
推荐指数
2
解决办法
1476
查看次数

为什么没有限制指针的效果

对于限制指针,我看不出gcc的代码有什么不同.

文件1

void test (int *a, int *b, int *c)
{
  while (*a)
  {
    *c++ = *a++ + *b++; 
  }
}
Run Code Online (Sandbox Code Playgroud)

文件2

void test (int *restrict a, int *restrict b, int *restrict c)
{
  while (*a)
  {
    *c++ = *a++ + *b++;
  }
}
Run Code Online (Sandbox Code Playgroud)

编译

  gcc -S -std=c99 -masm=intel file1.c
  gcc -S -std=c99 -masm=intel file2.c
Run Code Online (Sandbox Code Playgroud)

file1.sfile2.s都是相同的,除了.file告诉文件名的行:

    .file   "file1.c"
    .text
    .globl  test
    .type   test, @function
test:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq …
Run Code Online (Sandbox Code Playgroud)

c pointers restrict-qualifier

8
推荐指数
2
解决办法
303
查看次数

C1X最有用的特色是什么?

到目前为止,C1X最有用的功能是什么?当前的编译器对它们有什么支持?

c standards language-features c11

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

当`default:`标签放在大括号外时,复合开关语句中的局部变量是否被初始化?

通常在使用switch语句时,您无法定义初始化复合语句的局部变量,例如

switch (a)
{
  int b = 5;  /* Initialization is skipped, no matter what a is */

  case 1:
    /* Do something */
    break;
  default:
   /* Do something */
   break;
}
Run Code Online (Sandbox Code Playgroud)

但是,由于该switch语句是一个类似foror 的语句while,因此没有反对不使用复合语句的规则,请查看此处的示例.但这意味着,可以在switch关键字和左括号之后的右括号之间使用标签.

所以在我看来,有可能并且允许使用这样的switch语句:

switch (a)
  default:
{
  int b = 5;  /* Is the initialization skipped when a != 1? */
    /* Do something for the default case using 'b' */
    break; …
Run Code Online (Sandbox Code Playgroud)

c language-lawyer

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

在第四个换行符后切断字符串

我有问题,我想在第四个换行符后截断一个长字符串,并让它继续“ ...”

<?php
$teststring = "asddsadsadsadsaa\n
               asddsadsadsadsaa\n
               asddsadsadsadsaa\n
               asddsadsadsadsaa\n
               asddsadsadsadsaa\n
               asddsadsadsadsaa\n";
?>
Run Code Online (Sandbox Code Playgroud)

应该变成:

<?php
$teststring = "asddsadsadsadsaa\n
               asddsadsadsadsaa\n
               asddsadsadsadsaa\n
               asddsadsadsadsaa...";
?>
Run Code Online (Sandbox Code Playgroud)

我知道如何在第一次打断字符串之后,\n但我不知道如何在第四次打断字符串之后。

我希望你能帮助我。

php string

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

我使用restrict限定符时出错

当我编译以下程序时,我得到错误:

gcc tester.c -o tester

tester.c: In function ‘main’:
tester.c:7:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ptr_X’
tester.c:7:17: error: ‘ptr_X’ undeclared (first use in this function)
tester.c:7:17: note: each undeclared identifier is reported only once for each function it appears in
tester.c:10:17: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘ptr_Y’
tester.c:10:17: error: ‘ptr_Y’ undeclared (first use in this function)
Run Code Online (Sandbox Code Playgroud)
#include <stdio.h>

int main() {
  int x = 10;
  int y = 20;

  int *restrict ptr_X; …
Run Code Online (Sandbox Code Playgroud)

c pointers restrict-qualifier

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

thrd_busy和mtx_lock()/ mtx_timedlock()

我有关于C1x互斥量的以下问题(§7.25.4):

在哪些情况下可以mtx_lock()返回thrd_busy而不是阻止?在哪些情况下可以mtx_timedlock()返回thrd_busy

注意,thrd_busy在§7.25.15中定义为" 当测试和返回函数请求的资源已被使用时 ".

我希望thrd_busy只返回mtx_trylock(),或者最多也只能通过mtx_lock()一个mtx_trymtx_try | mtx_recursive互斥锁调用,但绝对不是来自mtx_timedlock(),这需要一个支持超时的互斥锁,即一个mtx_timedmtx_timed | mtx_recursive互斥锁.

这只是草案中的公正和疏忽吗?或者我错过了什么?

c multithreading mutex c11

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

我在哪里可以找到涵盖K&R1/2,C89-C1X及其起源的C(和/或C++)关键字列表?

我已经接触过许多编码指南,每个编程指南都为命名"事物"提供了指导.一个特定的C89命名规则触发了这个问题:明确禁止对变量使用名称"new",因为在C++中这是一个关键字.

这让我想到了下一个标准,C99有很好的文献记载,但C11相对较新(2014).标准委员会还有几个扩展仍在进行中.

因此,我想知道是否有人可以提供包含关键字及其来源的列表,以便制定一组命名规则,包括为什么要避免使用多个名称的原因.

虽然严格说话complex不是关键词,但最好包括类似的定义.而且C++信息也很受欢迎.

c c++ language-lawyer

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

带自定义操作的installshield

我正在使用installsheild 2012 premier创建一个基本的msi项目.我有两个问题.

1.)MSI在创建了正在安装的应用程序的文件夹和文件后,需要运行自定义exe.在安装应用程序时,它只需要执行一次.

2.)MSI还需要告诉自定义exe运行,用户选择运行MSI的语言.

我对问题2一无所知.关于问题1,这里是我的尝试,如下所述:

我现在设置它的方式,它在开始之前运行一次,甚至创建产品的文件和文件夹.以下是我的设置

在此输入图像描述

然后单击下一步转到下面的屏幕....

在此输入图像描述

现在,为了仅在创建文件和文件夹之后运行自定义exe,如果我在上面的第一个图像中将In-Script执行从"立即执行"更改为"提交执行"并继续下一个屏幕,那么我我尝试过的任何组合都会出现以下错误 在此输入图像描述

请帮帮我.谢谢你的时间.

installation windows-installer installshield

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