我正在使用带有编译器的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++问题都很感兴趣.
编辑:我知道混合int时sint32可能会产生不同的结果重新定义.但我们不允许直接使用原始的C类型,只允许使用typedef类型.
我正在寻找一个样本(表达式或片段)使用常量,一元/二元运算符,强制转换等,根据更改的类型定义,使用不同但正确的编译结果.
对于限制指针,我看不出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.s和file2.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) 到目前为止,C1X最有用的功能是什么?当前的编译器对它们有什么支持?
通常在使用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) 我有问题,我想在第四个换行符后截断一个长字符串,并让它继续“ ...”
<?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但我不知道如何在第四次打断字符串之后。
我希望你能帮助我。
当我编译以下程序时,我得到错误:
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) 我有关于C1x互斥量的以下问题(§7.25.4):
在哪些情况下可以mtx_lock()返回thrd_busy而不是阻止?在哪些情况下可以mtx_timedlock()返回thrd_busy?
注意,thrd_busy在§7.25.15中定义为" 当测试和返回函数请求的资源已被使用时 ".
我希望thrd_busy只返回mtx_trylock(),或者最多也只能通过mtx_lock()一个mtx_try或mtx_try | mtx_recursive互斥锁调用,但绝对不是来自mtx_timedlock(),这需要一个支持超时的互斥锁,即一个mtx_timed或mtx_timed | mtx_recursive互斥锁.
这只是草案中的公正和疏忽吗?或者我错过了什么?
我已经接触过许多编码指南,每个编程指南都为命名"事物"提供了指导.一个特定的C89命名规则触发了这个问题:明确禁止对变量使用名称"new",因为在C++中这是一个关键字.
这让我想到了下一个标准,C99有很好的文献记载,但C11相对较新(2014).标准委员会还有几个扩展仍在进行中.
因此,我想知道是否有人可以提供包含关键字及其来源的列表,以便制定一组命名规则,包括为什么要避免使用多个名称的原因.
虽然严格说话complex不是关键词,但最好包括类似的定义.而且C++信息也很受欢迎.
我正在使用installsheild 2012 premier创建一个基本的msi项目.我有两个问题.
1.)MSI在创建了正在安装的应用程序的文件夹和文件后,需要运行自定义exe.在安装应用程序时,它只需要执行一次.
2.)MSI还需要告诉自定义exe运行,用户选择运行MSI的语言.
我对问题2一无所知.关于问题1,这里是我的尝试,如下所述:
我现在设置它的方式,它在开始之前运行一次,甚至创建产品的文件和文件夹.以下是我的设置

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

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

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