有没有办法让gcc/g ++从命令行转储它的预处理器定义?我的意思是__GNUC__,__STDC__等等.
在Windows平台上编写Objective-C的最佳方法是什么?
Cygwin和gcc?有没有办法可以将它集成到Visual Studio中?
沿着这些方向 - 是否有任何关于如何链接和使用Windows SDK的建议.它是一个不同的野兽,但我知道我可以在Windows DLL中编写汇编和链接,让我可以访问这些调用,但我不知道如何做到这一点,没有谷歌搜索和零碎的方向.
是否有人知道一个好的在线或书籍资源来做或解释这些事情?
我目前正在使用GCC,但最近我发现了Clang而且我正在考虑切换.但是有一个决定性的因素 - 它产生的二进制文件的质量(速度,内存占用,可靠性) - 如果gcc -O3能够生成运行速度快1%或内存减少1%的二进制文件,那么它就是一个交易破坏者.
Clang拥有比GCC更好的编译速度和更低的编译时内存占用,但我真的对基准测试/比较结果编译软件感兴趣 - 你能指点我一些或描述你的经历吗?
为方便起见,我在下面添加了相关联机帮助页.
首先我的(错误)理解:如果我需要将选项分开,,这意味着第二个-Wl选项不是另一个选项,因为它在,此之前就意味着它是-rpath选项的参数.
我不明白怎么-rpath会有-Wl,.争论!
在我看来有意义的是:
-Wl,-rpath .
Run Code Online (Sandbox Code Playgroud)
这应该使用当前目录参数调用-rpath链接器选项.
男人gcc:
轮候册,选项
传递选项作为链接器的选项.如果选项包含逗号,则会在逗号中将其拆分为多个选项.您可以使用此语法将参数传递给该选项.例如,
-Wl,-Map,output.map传递-Map output.map给链接器.使用GNU链接器时,您也可以使用`-Wl,-Map = output.map'获得相同的效果.
男子ld:
-rpath = DIR
将目录添加到运行时库搜索路径.将ELF可执行文件与共享对象链接时使用此方法.所有-rpath参数都连接在一起并传递给运行时链接程序,后者使用它们在运行时查找共享对象.在定位链接中明确包含的共享对象所需的共享对象时,也会使用-rpath选项;
我有一个跨平台应用程序,在我的一些函数中,并没有使用传递给函数的所有值.因此我收到GCC的警告,告诉我有未使用的变量.
编码警告的最佳编码方式是什么?
围绕这个功能的#ifdef?
#ifdef _MSC_VER
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal qrLeft, qreal qrTop, qreal qrWidth, qreal qrHeight)
#else
void ProcessOps::sendToExternalApp(QString sAppName, QString sImagePath, qreal /*qrLeft*/, qreal /*qrTop*/, qreal /*qrWidth*/, qreal /*qrHeight*/)
#endif
{
Run Code Online (Sandbox Code Playgroud)
这太丑了,但似乎是编译器喜欢的方式.
或者我在函数末尾为变量赋值为零?(我讨厌它,因为它改变了程序流程中的某些东西以使编译器警告静音).
有正确的方法吗?
我试图从用户那里获取一些数据并将其发送到gcc中的另一个函数.代码是这样的.
printf("Enter your Name: ");
if (!(fgets(Name, sizeof Name, stdin) != NULL)) {
fprintf(stderr, "Error reading Name.\n");
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
但是,我发现它最后有一个换行符\n.所以,如果我输入John它最终发送John\n.如何删除它\n并发送正确的字符串.
我正在尝试构建GNU grep,当我运行make时,我得到:
[snip]
/bin/bash: line 9: makeinfo: command not found
Run Code Online (Sandbox Code Playgroud)
什么是makeinfo,我该如何获得它?
(这是Ubuntu,如果它有所作为)
我一直在阅读div和mul组装操作,我决定通过在C中编写一个简单的程序来实现它们:
#include <stdlib.h>
#include <stdio.h>
int main()
{
size_t i = 9;
size_t j = i / 5;
printf("%zu\n",j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
然后生成汇编语言代码:
gcc -S division.c -O0 -masm=intel
Run Code Online (Sandbox Code Playgroud)
但是看生成的division.s文件,它不包含任何div操作!相反,它通过位移和魔术数字来做某种黑魔法.这是一个计算代码片段i/5:
mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX
movabs rdx, -3689348814741910323 ; Move some magic number to RDX (?)
mul rdx ; Multiply 9 by magic number
mov rax, rdx ; Take only the upper 64 bits of the …Run Code Online (Sandbox Code Playgroud) 在Visual C++中,可以使用#pragma warning (disable: ...).我还发现在GCC中你可以覆盖每个文件的编译器标志.我怎样才能为"下一行"做这个,或者使用GCC围绕代码区域推送/弹出语义?
为什么这段代码:
class A
{
public:
explicit A(int x) {}
};
class B: public A
{
};
int main(void)
{
B *b = new B(5);
delete b;
}
Run Code Online (Sandbox Code Playgroud)
导致这些错误:
main.cpp: In function ‘int main()’: main.cpp:13: error: no matching function for call to ‘B::B(int)’ main.cpp:8: note: candidates are: B::B() main.cpp:8: note: B::B(const B&)
B不应该继承A的构造函数吗?
(这是使用gcc)
gcc ×10
c ×3
c++ ×2
assembly ×1
benchmarking ×1
clang ×1
constructor ×1
cygwin ×1
fgets ×1
g++ ×1
gcc-warning ×1
grep ×1
inheritance ×1
ld ×1
makefile ×1
newline ×1
objective-c ×1
optimization ×1
pragma ×1
rpath ×1
string ×1
ubuntu ×1
warnings ×1
winapi ×1
windows ×1
x86-64 ×1