请考虑以下代码,该代码具有无法访问的无法访问undefinedFunction
.
void undefinedFunction();
template <bool b = false>
void foo()
{
static_assert(b == false);
if (b)
undefinedFunction();
}
int main()
{
foo();
}
Run Code Online (Sandbox Code Playgroud)
GCC在没有投诉的情况下编译和链接.有了static_assert
,很难看出编译器如何做出不同的事情,但标准对此有什么要说的吗?如果static_assert
删除怎么办?编译器是否有义务删除分支,或者它实际上是否会发出一条无法访问的调用指令,这会导致链接器抱怨?
编译C程序的主要步骤是什么?通过编译,我的意思是(可能是错误的)使用gcc从包含C代码的纯文本中获取二进制文件.
我很想了解这个过程的一些关键点:
到那天结束时,我需要将我的C代码转换为我的CPU应该理解的语言.那么,谁在乎了解我的CPU特定指令呢?操作系统?
gcc是否将任何C转换为汇编语言?
我知道(实际猜测)对于每种处理器类型,我将需要一个汇编程序来解释(?)汇编代码并转换为我的CPU特定指令.这个汇编程序(谁发货)在哪里?它是否附带操作系统?
如果我用文本编辑器打开二进制文件,为什么我看不到0和1?
我想知道在编译C++程序时,.o或.so文件中存储的确切内容. 这篇文章给出了编译过程的一个相当不错的概述,并在其.o文件的功能,而据我了解,从这个帖子,u和.so文件只是多个.o文件合并成一个单一的文件,以静态(.a)或动态(.so)方式链接.
但我想检查一下我是否正确理解了这样一个文件中存储的内容.编译以下代码后
void f();
void f2(int);
const int X = 25;
void g() {
f();
f2(X);
}
void h() {
g();
}
Run Code Online (Sandbox Code Playgroud)
我希望在.o文件中找到以下项目:
g()
,包含一些占位符地址f()
和f2(int)
调用的位置.h()
,没有占位符X
,这只是数字25
g()
,h()
并且X
可以找到f()
和f2(int)
,其必须在链接期间得到解决.然后一个程序nm
会列出两个表中的所有符号名称.
我想编译器可以f2(X)
通过调用f2(25)
来优化调用,但它仍然需要将符号X保留在.o文件中,因为无法知道它是否将从不同的.o文件中使用.
那会是正确的吗?.a和.so文件是否相同?
谢谢你的帮助!
我一直在使用Java工作,而C++也让人困惑.
在Java中你有类文件,起初我认为它相当于C++中的头文件,如下所示:
#ifndef PROGRAM_H
#define PROGRAM_H
#include <iostream>
#include <string>
class Program {
private:
std::string name, version, author;
public:
Program(std::string name, std::string version, std::string author) {
this->name = name;
this->version = version;
this->author = author;
}
std::string toString() {
return name + " " + version + " - by " + author + "\n";
}
} MainProgram("program", "2.0a", "foo bar");
#endif
Run Code Online (Sandbox Code Playgroud)
我刚刚读到我应该将我的类分成两个文件,用于定义类的头文件和用于实现类的.cpp.
我真的应该为每个班级做些什么吗?因为上面的头类编译得很好,并且将它真正地分成两个文件似乎太简单了,也许只有大型类才能按惯例分开?有什么建议?
我是c ++的新手,并且一直在学习如何创建一个makefile,并注意到我的一个例子(与'更新'更改文件,忽略未更改的文件有关)具有以下命令:
# sysCompiler is set to g++
.o:.cpp
$(sysCompiler) -c $<
Run Code Online (Sandbox Code Playgroud)
根据g ++手册,这会编译或汇编源文件,但不会链接它们.
> -c编译或汇编源文件,但不要链接.链接阶段根本没有完成.最终输出是每个源文件的目标文件的形式.默认情况下,源文件的目标文件名是通过替换后缀
.c',
.i',..s', etc., with
o'来创建的.无法识别的输入文件(不需要编译或汇编)将被忽略.
换句话说,我只是想知道在c ++中进行编译时究竟"没有链接"是什么意思?
当我使用 Cocoapods 或手动向项目添加框架时,它们仅包含头文件。在 Xcode 中,使用“跳转到定义”没有定义(这意味着没有 .m 文件)。
当调用库中的函数时,如果.m文件不在项目中,编译器如何获取其实现?
假设我们想使用“socket”函数创建一个套接字。编译器如何知道它必须为相应的函数调用系统调用?是否有任何内部表记录函数属于特定的库集?
我有一个hello world cpp文件.如果我通过c++ test.cpp -o test
我得到"test"文件来编译它是可执行文件(-rwxr-xr-x
)并且如果我执行它,它将被执行并生成预期结果.
但是,如果我使用${CXX} -std=c++0x -I${INCLUDE_DIR1} -c test.cpp -o test -L{LIB_DIR1} -llib_name
我也得到"测试"文件但在这种情况下它不可执行.所以,我无法执行它.我试图chmod +x
,它获得执行权限,但如果我尝试执行它会得到一条错误消息(无法执行).
我做错了什么以及如何纠正?
请考虑以下代码:
//header.h
#pragma once
class A
{
public:
A();
void f();
};
//header.cpp
#include "header.h"
A::A(){}
void A::f(){}
//main.cpp
#include "header.h"
int main()
{
A a;
a.f();
}
Run Code Online (Sandbox Code Playgroud)
那么编译器如何知道constructor
和f
函数的声明究竟在哪里,因为只有header.h
in包含在main.cpp
?为什么它在class A
模板时找不到相同的功能?
我正在尝试使用gsl在c ++中编译一个简单的程序.在我们的大学服务器上,我们安装了GSL.主要问题是,我正在努力:
g++ atest.cpp -c -lgsl -lgslcblas -c lm
Run Code Online (Sandbox Code Playgroud)
之后,我正在打字:
./a.out
Run Code Online (Sandbox Code Playgroud)
我得到:
-bash: ./a.out : No such file or directory
Run Code Online (Sandbox Code Playgroud)
有什么问题?谢谢.
c++ ×8
compilation ×4
c ×2
archive-file ×1
assembly ×1
bash ×1
c++11 ×1
c++14 ×1
cocoapods ×1
executable ×1
frameworks ×1
gcc ×1
gsl ×1
linker ×1
linux ×1
makefile ×1
object-files ×1
objective-c ×1
sockets ×1
templates ×1