有谁知道我怎么能找出cl.exe的内置/预定义宏?例如,对于gcc,以下命令行将列出所有编译器的内置宏
gcc -dM -E - </dev/null
Run Code Online (Sandbox Code Playgroud)
编辑:我对类似于gcc的方式感兴趣,就是"询问实际的编译器".
谢谢
我收到警告消息"cl:命令行警告D9035:选项'Gm'已被弃用,并将在以后的版本中删除",同时使用Visual Studio 2017最新更新15.9.2构建我的项目.如何解决此警告?
我使用的是Visual Studio 2017.在一个项目中(我的目标是x64),我得到错误:C1060,编译器没有堆空间,遗憾的是在那里学习了编译时存在内存限制.
在监视CL.exe时,它确实在达到4GB之前停止.所以看起来CL.exe默认是32位应用程序,如下所示:https://docs.microsoft.com/en-us/cpp/build/how-to-enable-a-64-bit-visual- CPP-工具集-上的命令行
阅读本页后,我安装了"通用Windows平台工作负载",希望能够访问64位版本的CL.exe.但是在编译我的项目时没有变化,我在visual studio中看不到选择编译器版本的单个选项.
我假设必须有一个解决方法,能够为一个编译单元使用超过4GB,但我现在找不到它.任何帮助将非常感激.
编辑:我在调试模式下遇到限制.编译在发布模式下运行良好.这是有道理的.
就在最近,我了解到你可以使用类似函数类型的变量语法来声明一个函数(包括方法):
using function_type = int (double);
// pre-C++11:
//typedef int function_type(double);
function_type fun_global;
struct methods
{
static function_type mem_fun_static;
function_type mem_fun_normal;
virtual function_type mem_fun_virtual;
virtual function_type mem_fun_abstract = 0;
};
Run Code Online (Sandbox Code Playgroud)
在上面的代码中
fun_global 是一个全球性的功能,mem_fun_static是一个static成员函数,mem_fun_normal 是一种普通的方法,mem_fun_virtual是一种virtual方法,mem_fun_abstract 是一种抽象的方法.所有这些都采用单一的类型参数double和返回int值 - 就像function_type说的那样.
这些年来我都知道C++而且我不知道这个 - 这种语言永远不会让我感到惊讶!顺便说一下 - 这里提到的语法是什么?我没看到这个......
然而,在探索这个新功能时,我偶然发现编译器之间存在一些不一致之处.对于测试,我使用以下编译器:
g++ -Wall -Wextra -pedantic -std=c++14clang++ -Wall -Wextra -pedantic -std=c++14cl /W4 …我已经尝试为我的项目构建柯南包一周了。我一直在阅读文档,但有很多地方我仍然感到困惑。
我认为有4个文件非常重要:
每个文件的用途是什么?每个文件应该位于哪里?哪些是可以互换的?
我有以下conanfile.py生成柯南包的内容:
from conans import ConanFile, CMake
class mylibConan(ConanFile):
name = "mylib"
version = "1.16.0"
generators = "cmake"
settings = "os", "arch", "compiler", "build_type"
options = {"shared": [True, False]}
default_options = "shared=False"
exports_sources = ["*"]
url = ""
license = ""
description = "The mylib HAL library."
def configure(self):
self.options.shared = False
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
libs_build_dir = "lib_mylib/" + str(self.settings.build_type)
api_dir = "modules/mylib/lib/api/"
self.copy(pattern="lib_mylib.lib", dst="lib", src=libs_build_dir) …Run Code Online (Sandbox Code Playgroud) 这段代码(注意注释行):
#include <malloc.h>
#pragma warning(error: 4701)
int main(){
char buffer[1024];
//buffer[0] = 0;
void *p;
int size = 1;
if (size < 2)
p = malloc(size);
free(p); // C4701
return 0;
}
Run Code Online (Sandbox Code Playgroud)
发出以下警告(如预期):
f:\d\warning.cpp(13) : error C4701: potentially uninitialized local variable 'p' used
Run Code Online (Sandbox Code Playgroud)
然而,当我取消分配中main(),警告不再给出.我正在使用/RTC1命令行选项进行编译以启用运行时错误检查:
cl.exe /RTC1 warning.cpp
Run Code Online (Sandbox Code Playgroud)
我已经尝试了Visual C++ 2013和2015中最新的64位版本的编译器.两者都产生了相同的行为.
问题是:这是一个编译器错误,还是有解释?微软的文档提到/ RTC1可能会在给出C4701的地方给出运行时错误,但它没有说明警告被抑制.
编辑:令人费解的是,警告只有在buffer[0] = 0;没有评论时才会消失.
是否有任何选项(/ O2除外)来改进Visual C++代码输出?在这方面,MSDN文档非常糟糕.请注意,我不是在询问项目范围的设置(链接时优化等).我只对这个特殊的例子感兴趣.
相当简单的C++ 11代码如下所示:
#include <vector>
int main() {
std::vector<int> v = {1, 2, 3, 4};
int sum = 0;
for(int i = 0; i < v.size(); i++) {
sum += v[i];
}
return sum;
}
Run Code Online (Sandbox Code Playgroud)
Clang的libc ++输出非常紧凑:
main: # @main
mov eax, 10
ret
Run Code Online (Sandbox Code Playgroud)
另一方面,Visual C++输出是一个多页面的混乱.我在这里遗漏了什么,还是VS真的很糟糕?
编译器资源管理器链接:https: //godbolt.org/g/GJYHjE
我编写了一个小函数模板,它将新容器中的不同容器连接起来:
#include <vector>
#include <unordered_set>
#include <string>
#include <iostream>
#include <iterator>
namespace impl
{
template <typename OutIterator, typename Container, typename ...Containers>
void join(OutIterator iterator, const Container& container, const Containers& ...containers)
{
for (const auto& item : container)
*iterator++ = item;
join(iterator, containers...); // gcc and clang cannot resolve this call
}
template <typename OutIterator, typename Container>
void join(OutIterator iterator, const Container& container)
{
for (const auto& item : container)
*iterator++ = item;
}
}
template <typename OutContainer, typename ...Containers>
OutContainer …Run Code Online (Sandbox Code Playgroud) 如何使用gsutil命令在Google云存储中的存储桶中创建新文件夹?
我尝试在创建存储桶时使用相同的命令但仍然出错
gsutil mb -l us-east1 gs://my-awesome-bucket/new_folder/
Run Code Online (Sandbox Code Playgroud)
谢谢!
#include <stdio.h>
#include <stdint.h>
#include <fenv.h>
#include <math.h>
int main()
{
typedef union { uint32_t u; float f; } ufloat;
ufloat val;
float arg = 2401.999999;
int r;
r = fesetround(FE_DOWNWARD);
val.f = sqrtf(arg);
printf ("FE_DOWNWARD %22.13a [0x%x] %d\n", val.f, val.u, r);
r = fesetround(FE_TONEAREST);
val.f = sqrtf(arg);
printf ("FE_TONEAREST %22.13a [0x%x] %d\n", val.f, val.u, r);
r = fesetround(FE_TOWARDZERO);
val.f = sqrtf(arg);
printf ("FE_TOWARDZERO %22.13a [0x%x] %d\n", val.f, val.u, r);
r = fesetround(FE_UPWARD);
val.f = sqrtf(arg);
printf ("FE_UPWARD %22.13a [0x%x] …Run Code Online (Sandbox Code Playgroud)