Tag: g ++

代码用g ++但不是gcc编译

下面的代码用g ++而不是gcc编译,我想知道为什么? inline unsigned FloatFlip(unsigned f) { unsigned mask = -int(f >> 31) | 0x80000000; return f ^ mask; } 我假设在C ++中,int(f >> 31)是一个构造函数,但这让我想知道为什么它包含在代码中。是否有必要?

包含C头文件的C ++文件

我需要在我的C ++项目中包含一个C头文件,但g ++会抛出“未在此范围内声明”错误。 我读到我需要使用extern“C”关键字来修复它,但它似乎对我不起作用。 这是一个触发此错误的虚拟示例。 main.cpp中: #include extern “C” { #include “includedFile.h” } int main() { int a = 2; int b = 1212; std::cout<< "Hello World!\n"; return 0; } includedFile.h #include enum TypeOfEnum { ONE, TWO, THREE, FOUR = INT32_MAX, }; 抛出的错误是: $> g++ main.cpp In file included from main.cpp:4:0: includedFile.h:7:9: error: ‘INT32_MAX’ was […]

指向未知数组的指针?

gcc接受以下函数声明,但g ++不接受。 void do_something(char (*)[]); g ++给出的错误是: error: parameter ” includes pointer to array of unknown bound ‘char []’ 我相信在C中,参数转换为char **,这就是gcc接受它的原因。 我能以某种方式让g ++接受这个function吗? 参见示例: http : //ideone.com/yqvqdB 🙂 谢谢!

是C文件中需要extern“C”? (解决奇怪的Eclipse行为)

我对使用gcc和g ++工具的Mixed C / C ++应用程序比较陌生。 为了掌握它,我已经下载了iperf源代码并使用Eclipse成功构建了它。 有一个奇怪之处:如果我使用Eclipse查看文件“Thread.c”,它认为存在语法错误并且几乎整个文件都加下划线,好像代码有缺陷,这绝对不是。 这是触发它的代码片段: #ifdef __cplusplus extern “C” { #endif 我知道在C ++中使用extern“C”,但是当存在于.c文件中时Eclipse出现问题。 它很高兴地在.cpp和.h文件中接受它。 我已经检查了Make实用程序如何构建iperf应用程序,我看到它总是使用gcc来编译c文件和g ++来编译cpp文件,这让我想知道是否真的需要extern“C”。 它肯定没有受到伤害,因为gcc编译器很乐意处理它,但如果不是严格要求我可以省略它并在Eclipse中获得更好的可读性。 我还看了一个Eclipse的行为的可能解决方案,但还没有找到一个,如果有人能指出如何解决它同样好。

函数仅在标题中定义时才会内联。 我错过了什么吗?

使用gcc v4.8.1 如果我做: //func.hpp #ifndef FUNC_HPP #define FUNC_HPP int func(int); #endif //func.cpp #include “func.hpp” int func(int x){ return 5*x+7; } //main.cpp #include #include “func.hpp” using std::cout; using std::endl; int main(){ cout<<func(5)<<endl; return 0; } 即使是简单的函数func也不会内联。 原型和/或定义上没有inline , extern , static和__attribute__((always_inline))的组合改变了这一点(显然这些说明符的某些组合导致它甚至不编译和/或产生警告,而不是讨论那些) 。 我正在使用g++ *.cpp -O3 -o run和g++ *.cpp -O3 -S来进行汇编输出。 当我查看程序集输出时,我仍然看到call func 。 它似乎只有我能够正确内联函数的方法是拥有原型(可能没有必要)和头文件中函数的定义。 如果标题仅包含在整个程序中的一个文件中(例如仅由main.cpp包含),则它将进行编译,并且函数将被正确内联,甚至不需要inline说明符。 如果要将标头包含在多个文件中,则似乎需要inline说明符来解决多个定义错误,这似乎是其唯一目的。 […]

为什么这个用C编译而不是C ++(sigaction)?

尝试使用g ++编译下面的代码时出现以下错误。 当我使用gcc编译它时它工作正常(除了一些警告)。 任何帮助赞赏。 g++ ush7.cpp ush7.cpp: In function ‘int signalsetup(sigaction*, sigset_t*, void (*)(int))’: ush7.cpp:93: error: expected unqualified-id before ‘catch’ ush7.cpp:95: error: expected primary-expression before ‘catch’ ush7.cpp:95: error: expected `;’ before ‘catch’ ush7.cpp:97: error: expected primary-expression before ‘catch’ ush7.cpp:97: error: expected `;’ before ‘catch’ ush7.cpp:100: error: expected primary-expression before ‘catch’ ush7.cpp:100: error: expected `)’ before […]

gcc / g ++可以告诉我何时忽略了我的注册?

使用gcc / g ++编译C / C ++代码时,如果它忽略了我的寄存器,它可以告诉我吗? 例如,在此代码中 int main() { register int j; int k; for(k = 0; k < 1000; k++) for(j = 0; j < 32000; j++) ; return 0; } j将用作寄存器,但在此代码中 int main() { register int j; int k; for(k = 0; k < 1000; k++) for(j = 0; j < […]

是否存在使用g ++ 无法正确编译有效C代码的情况

可能重复: “C ++的C子集” – >哪里没有? 例子? 我知道C是C ++的一个子集(即不存在有效的C代码,它不是有效的C ++代码)。 我的问题是g++是否与所有C代码完全兼容。 例如,将 g++ -o testing test.c 产生相同的二进制文件 gcc -o testing test.c 在所有情况下? 更具体地说,如果他们并不总是创建相同的二进制文件,那么有什么理由可能会出现问题吗? 如果我不确定代码,总是使用g++是否安全?

C和C ++之间不完整数组指针转换规则的差异

当我用gcc和g++编译下面的代码时, g++给出错误而不是gcc 。 请注意,代码从int (*)[4]为int (*)[] (指向不完整数组类型的指针)。 int arr[4]; int (*p_arr)[] = &arr; 如不完整数组类型中所述? , C语言允许这种转换。 但是为什么C++不允许这样做并给出错误error: cannot convert ‘int (*)[4]’ to ‘int (*)[]’ in assignment 。 我知道C ++比C更安全类型,但是这个赋值实际上是类型不安全的,因为后来指针的引用(例如sizeof(*p_arr) )无论如何都会在C出错?

请求从’KanjiCard *’转换为非标量类型’KanjiCard’(自定义枚举)

好吧,我已经尝试过使用Google-sensei并在这个网站上搜索一下,虽然我发现了很多关于这个错误的post,但我还没有发现任何有关枚举的post。 此外,我所看到的所有人都有人试图将一种类型分配给另一种类型,不恰当地使用“新”等等。据我所知,在这种情况下情况并非如此。 正如标题中所述,在尝试编译我正在使用g ++编写的程序时,我收到了conversion from ‘KanjiCard*’ to non-scalar type ‘KanjiCard’ requested的错误conversion from ‘KanjiCard*’ to non-scalar type ‘KanjiCard’ requested 。 我有一个名为KanjiCard的类,它具有这个公开定义的枚举: enum KanjiCardType { KANJI_CARD = 1, KEYWORD_CARD = 2 }; 该类的构造函数定义如下: KanjiCard(char *cardText, int cardTextLength, int cardWidth, int cardHeight, int cardX, int cardY, KanjiCardType cardType, SDL_Color textColor); (我使用的是char *而不是std :: string,因为它更容易使用我正在使用的库。) 我打电话给它创建这样的新卡(这是错误出现的地方): KanjiCard currentCard = […]