Tag: visual c ++

MSVC相当于__attribute __((warn_unused_result))?

我发现__attribute__ ((warn_unused_result))作为一种鼓励开发人员不要忽略函数返回的错误代码的方法非常有用,但我需要使用它来处理MSVC以及gcc和gcc兼容的编译器,如ICC。 Microsoft Visual Studio C / C ++编译器是否具有等效机制? (到目前为止,我试过通过MSDN没有任何运气。)

编译器支持GNU语句表达式

哪些现代编译器支持Gnu语句表达式(C和C ++语言)。 我应该使用哪个版本的语句表达式? 语句表达式就像({ code; code; retval }) : int b=56; int c= ({int a; a=sin(b); a}) 我已经知道一些这样的编译器: GCC> = 3 Clang / LLVM> =? 英特尔C ++编译器> = 6.0(Linux版本, 检查第4页 ;位受限 ) Sun Studio> = 12( 新语言扩展 ) IBM XL for z / OS( 标记为IBM扩展 ) Open64(因为它使用了osprey-gcc前端) 这个编译器似乎不支持这个(我不确定): MS Visual C ++ PS。 这里列出了一些C / […]

编译器如何处理可变长度数组

这似乎是一个初学者的问题,但我对编译器通常创建变量维数组的方式感兴趣,就像在下面的程序中一样。 #include int main(){ int n; std::cin>>n; int a[n]; } 根据我所知,在C中,所有初始化值必须是常量,以便编译器知道在函数内保留多少内存,通常通过减去堆栈指针以容纳数组所包含的元素数量。 这对我来说很有意义。 但是,我不太明白编译器如何处理上述程序,因为它似乎与G ++(MinGW)一起工作,但是使用Cl,Microsoft的C ++编译器失败了。 我怀疑GCC通过非标准扩展在堆上分配内存,但我不确定。 此外,微软的编译器并不因标准兼容而闻名,所以如果它对待上述程序的方式实际上可能出错,我也不会感到惊讶。

使用进位标志添加多字

GCC具有128位整数。 使用这些我可以让编译器使用mul (或只有一个操作数的imul )指令。 例如 uint64_t x,y; unsigned __in128 z = (unsigned __int128)x*y; 生产多 我用它来创建一个128×128到256的函数(在更新之前,请参阅此问题的结尾,如果您感兴趣,请参阅此代码)。 现在我想要进行256位加法,除了使用汇编之外,我还没有找到让编译器使用ADC的方法。 我可以使用汇编程序,但我想要内联函数以提高效率。 编译器已经生成了一个有效的128×128到256函数(因为我在这个问题的开头解释了)所以我不明白为什么我应该在汇编中重写它(或者编译器已经有效实现的任何其他函数) 。 这是我提出的内联汇编函数: #define ADD256(X1, X2, X3, X4, Y1, Y2, Y3, Y4) \ __asm__ __volatile__ ( \ “addq %[v1], %[u1] \n” \ “adcq %[v2], %[u2] \n” \ “adcq %[v3], %[u3] \n” \ “adcq %[v4], %[u4] \n” \ : […]

如何找出cl.exe的内置宏

有谁知道我怎样才能找出cl.exe的内置/预定义宏? 例如,对于gcc,以下命令行将列出所有编译器的内置宏 gcc -dM -E – </dev/null 编辑:我对类似于gcc的方式感兴趣,就是“询问实际的编译器”。 谢谢

如何使用Visual Studio 2012编译Win XP?

好的,所以我在Windows 7 x64中使用Visual Studio 2012进行编程和编译。 我的应用程序在那里工作正常,但是当我尝试从Windows XP SP3虚拟机执行它时,我立刻得到“xxxx.exe不是一个有效的win32应用程序”。 正在使用静态链接编译应用程序,即使用/ MT。 我在targetver.exe中将_WIN32_WINNT设置为0x0501; 配置管理器设置为Win32,链接器高级选项中的目标计算机设置为MACHINEX86。 我的targetver.h看起来像这样: #include #define _WIN32_WINNT 0x0501 #define WINVER 0x0501 #define NTDDI_VERSION 0x0501 #include 我也尝试使用/ MD进行编译并安装.NET Framework,但这也没有用。 我很无能,我真的可以使用一些帮助,因为我需要让它适用于Windows XP。 提前致谢。

C / C ++中有哪些不同的调用约定,每个含义是什么?

C / C ++中有不同的调用约定: stdcall , extern , pascal等。有多少这样的调用约定可用,各自的含义是什么? 有没有描述这些的链接?

‘asm’,’__ asm’和’__asm__’有什么区别?

据我所知, __asm { … };之间的唯一区别__asm { … }; 和__asm__(“…”); 是第一个使用mov eax, var ,第二个使用movl %0, %%eax使用:”=r” (var) 。 还有什么其他差异? 那么asm呢?

在64位中进行组合乘法除法运算的最准确方法是什么?

对于在32位和64位程序(在Visual C ++中)都能工作的64位整数,我能够进行乘法除法运算的最准确方法是什么? (如果溢出,我需要结果mod 2 64. ) (我正在寻找类似MulDiv64的东西,除了这个使用内联汇编,它只适用于32位程序。) 显然,可以进行double和后退,但我想知道是否有更准确的方法并不太复杂。 (即我不是在寻找任意精度的算术库!)

在MS Visual C ++中启用VLA(可变长度数组)?

如何在MS Visual C ++中启用使用C99中定义的VLA或可变长度数组,或者根本不可能? 是的我知道C ++标准是基于C89的,并且VGA在C89标准中不可用,因此在C ++中不可用,但MSVC ++也应该是C编译器,可以使用/ TC编译器参数( Compile as C Code (/TC) )。 但这样做似乎并没有启用VLA,并且编译过程在构建为C ++( Compile as C++ Code (/TP) )时会出现相同的错误。 也许MSVC ++ C编译器只符合C89或者我缺少一些东西(一些特殊的构造或pragma / define)? 代码示例: #include int main(int argc, char **argv) { char pc[argc+5]; /* do something useful with pc */ return EXIT_SUCCESS; } 编译错误: 错误C2057:预期的常量表达式 错误C2466:无法分配常量大小为0的数组 错误C2133:’pc’:未知大小