在我的代码中,我有一个带bool value模板参数的函数.除了一行之外,在true和false案例中函数的实现几乎完全相同.所以我想我会if(value)发表一个声明,以避免重写相同的函数两次.调用函数时,value在编译时确定,因此if语句缩减为a if(true)或a if(false).现在,我想知道:这是安全的假设,任何合理的编译器(比如说g++,clang++...)将优化这种说法?
是的,性能至关重要,是的,功能非常轻巧,因此即使是单一的if也会影响速度,是的,这个功能需要在许多人类赖以生存的实时设备上执行数万次.
特别是,如何使g ++拒绝这种无效的标准C++代码:
main(){}
Run Code Online (Sandbox Code Playgroud)
?
我正在使用MinGW g ++ 6.2.0,但我认为答案将适用于所有当前使用的g ++变体.
我试过的例子:
[C:\my\temp]
> g++ --version | find "++"
g++ (i686-win32-dwarf-rev1, Built by MinGW-W64 project) 6.2.0
[C:\my\temp]
> type foo.cpp
main() {}
[C:\my\temp]
> dir /b
foo.cpp
[C:\my\temp]
> g++ foo.cpp -Wall -Wextra -Wreturn-type -pedantic
[C:\my\temp]
> dir /b
a.exe
foo.cpp
[C:\my\temp]
> _
带有详细编译器输出的版本信息:
C:\my\temp] > g++ -v --version Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=C:/Program\ Files\ (x86)/mingw-w64/i686-6.2.0-win32-dwarf-rt_v5-rev1/mingw32/bin/../libexec/gcc/i686-w64-mingw32/6.2.0/lto-wrapper.exe g++ (i686-win32-dwarf-rev1, Built by MinGW-W64 project) 6.2.0 Copyright (C) 2016 Free Software Foundation, Inc. This …
我有一个奇怪的问题.我可以编译我的代码,arm但不能x86使用gcc v 6.3(和其他也).这是一个导致问题的示例代码.
#include <stdint.h>
#include <cstdio>
#include <unistd.h>
#include <csignal>
volatile bool $run = true;
static void quitHandler(int __attribute__((unused)) signum)
{
$run = false;
}
void setupQuitHandler()
{
struct sigaction action;
action.sa_handler = quitHandler;
action.sa_flags = SA_RESETHAND;
if (sigemptyset(&action.sa_mask) < 0) printf("[SetupQuit] sigemptyset");
if (sigaction(SIGINT, &action, nullptr) < 0) printf("[SetupQuit] sigaction SIGINT");
if (sigaction(SIGQUIT, &action, nullptr) < 0) printf("[SetupQuit] sigaction SIGQUIT");
if (sigaction(SIGTERM, &action, nullptr) < 0) printf("[SetupQuit] sigaction SIGTERM");
if (sigaction(SIGABRT, &action, nullptr) < …Run Code Online (Sandbox Code Playgroud) 我的理解是该功能std::isnan仅从C++ 11开始提供.此外,除非特别说明,否则g++使用-std=gnu++98.
那为什么这会编译?
>> cat test.cpp
#include <cmath>
int main(int argc, char** argv)
{
return std::isnan(0);
}
>> g++ test.cpp
Run Code Online (Sandbox Code Playgroud)
是否有一个标志来取出该功能<cmath>?
char buffer[4];
std::cout << &buffer << std::endl;
std::cout << &buffer[0] << std::endl;
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,第一行是缓冲区中第一个元素的十六进制地址.第二行是四个问号(除非我转换为空指针).
第二个陈述与第一个陈述有何不同(从语义上讲,它们是相同的?)?为什么第二行显示为问号而不是随机垃圾字符?
我的.cpp和.h文件的路径: /home/quasiturbine/ServerProject/Network/NetworkIncludes/
在那里你可以找到TCP_Connexion.h和TCP_Connexion.cpp
在.cpp文件中,我得到了#include "NetworkIncludes\TCP_Connexion.h"默认的构造函数/析构函数.而已.
G ++命令:
g++ -o program -I/home/quasiturbine/ServerProject/Network/ /home/quasiturbine/ServerProject/Network/NetworkIncludes/TCP_Connexion.cpp
Run Code Online (Sandbox Code Playgroud)
致命错误:/home/quasiturbine/ServerProject/Network/NetworkIncludes/TCP_Connexion.cpp:1:43:致命错误:NetworkIncludes\TCP_Connexion.h:没有这样的文件或文件夹#include"NetworkIncludes\TCP_Connexion.h"
有什么问题,我该如何解决?
我知道C ++有标准而不是版本,因此,它们的发布由规范管理(例如C99,C ++ 11等)
C ++编译器具有版本,并且每个版本都可以支持多种c ++标准。
关于上述内容,我找到了我的g ++版本编译器,即7.2.0
? bgarcial [~] ? g++ --version
g++ (Ubuntu 7.2.0-8ubuntu3) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
? bgarcial [~] ?
Run Code Online (Sandbox Code Playgroud)
我的g ++编译器具有以下目录,我正在使用本机Makefile以C ++语言进行构建
? bgarcial [include/c++/7] ? pwd
/usr/include/c++/7
? bgarcial [include/c++/7] ?
Run Code Online (Sandbox Code Playgroud)
如何确定我的g ++编译器支持哪些C ++标准?
所述克++文档包括以下信息:
GCC支持1998年发布的原始ISO C ++标准以及2011和2014年的修订版。如果未提供C ++语言方言选项,则默认值为-std = gnu ++ …
我正在尝试为我的项目编写Makefile.这是文件结构:
Makefile文件:
CXXFLAGS = -ISDL2/include -std=c++11
LXXFLAGS = -lSDL2/lib/x86 -lSDL2main -lSDL2 -lSDL2_image
main.exe: main.o BoardField.o ChessPiece.o Game.o
g++ main.o BoardField.o ChessPiece.o Game.o -o main.exe $(LXXFLAGS) -std=c++11
main.o: main.cpp
g++ main.cpp -c $(CXXFLAGS)
BoardField.o: BoardField.cpp
g++ BoardField.cpp -c $(CXXFLAGS)
ChessPiece.o: ChessPiece.cpp
g++ ChessPiece.cpp -c $(CXXFLAGS)
Game.o: Game.cpp
g++ Game.cpp -c $(CXXFLAGS)
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
g ++ main.o BoardField.o ChessPiece.o Game.o -o main.exe -lSDL2/lib/x86 -lSDL2main -lSDL2 -lSDL2_image -std = c ++ 11 c:/ mingw/bin /../ lib/gcc /mingw32/6.3.0/../../../../mingw32/bin/ld.exe:找不到-lSDL2/lib/x86 c:/ mingw/bin /../ lib/gcc/mingw32 /6.3.0/../../../../mingw32/bin/ld.exe:找不到-lSDL2main c:/ mingw/bin …
只是为了好奇和实验,我写了下面的代码,现在我想了解删除后发生的事情...为什么猫对象还在喵喵?
我使用的编译器版本:
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
Run Code Online (Sandbox Code Playgroud)
并编译代码:
g++ cat.cpp -pedantic -Wall -o cat
Run Code Online (Sandbox Code Playgroud)
在删除后调用meou()时,其他编译器可能会崩溃.
我想知道
代码:
#include <iostream>
using namespace std;
class Cat
{
public:
Cat() { cout << "Cat construct" << endl; }
~Cat() { cout << "Cat destruct" << endl; }
void meow();
};
void Cat::meow(void)
{
cout << "meow..." << endl;
}
int main()
{
Cat * pCat = new Cat;
pCat->meow();
cout << "pCat = " << pCat << endl;
delete pCat;
pCat …Run Code Online (Sandbox Code Playgroud) 在尝试编译一个类时,我继续崩溃gcc(由于内存不足),该类使用在我的类的相应.h文件中定义的许多函数模板.当我开始编译该cpp文件时,我有6.4GB的可用内存:
$ free -mh
total used free shared buff/cache available
Mem: 9.7G 3.1G 6.5G 260K 212M 6.4G
Swap: 947M 887M 59M
Run Code Online (Sandbox Code Playgroud)
这是gcc的详细信息:
$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/7/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.3.0-16ubuntu3' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --with-as=/usr/bin/x86_64-linux-gnu-as --with-ld=/usr/bin/x86_64-linux-gnu-ld --program-suffix=-7 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu …Run Code Online (Sandbox Code Playgroud)