我决定通过编译我的一个c++项目来试用一下,这个项目已经在GCC下编译过了。我的项目依赖于Boost,并且由于包含了"boost/asio.hpp“,clang在使用pedantic标志进行编译时会出现以下错误:
lib/boost_1_46_1/mac/boost/date_time/date_generators.hpp:37:30: error: extra ';'
inside a class [-pedantic]
如果我想编译这个项目,我有什么选择?我不希望在这个问题出现的地方编辑各种boost头文件。
根据我的记忆,下面这段代码应该可以在C++上很好地编译,但不能在C中编译,唯一的问题是如何测试它?它在g++上编译得很好,在gcc上也是如此。我假设g++是C++编译器,而gcc是C编译器。我已经在Windows下用mingw尝试过了。我说的对吗?如果不是,那么如何使用C编译器编译它。
int main() {
const int i = 1;
const int j = 2;
const int k = 3;
int array[i + j + k];
return 0;
}
我在python中使用iminuit继承了一个函数,但即使使用"print_level =-1“或"print_level =0”也无法消除该消息。
下面是我使用的极简代码:
from iminuit import Minuit
m = Minuit(chi2, alpha=1., beta=0., print_level=-1)
它返回:
creatFitsFile.py:430: InitialParamWarning: errordef is not given. Default to 1.
m = Minuit(chi2, alpha=1., beta=0., prin
我在C中读到了VLAs,这本书严格地说,VLAs的引入是从C99标准开始的。每当我试图在for循环的头中声明一个循环控制变量时,gcc告诉我,此操作仅允许在C99模式下执行。但是,下面的测试代码编译并工作(尽管它会打印垃圾变量,考虑到没有初始化数组元素,这是应该的)。
#include <stdio.h>
int main(){
int x;
int i = 9;
int array[i];
for(x = 0; x < i; x++)
printf("%d\n", array[x]);
re
说
数组维度必须在编译时知道,这意味着该维度必须是一个常量表达式。
另有一点是,
unsigned count = 42; // not a constant expression
constexpr unsigned size = 42; // a constant expression
我希望下面的声明失败
a[count]; // Is an error according to Primer
然而,事实并非如此。编译并运行良好。
同样奇怪的是,数组声明之后的++count;也不会引起任何问题。
用-std=c++1
我最近遇到了一个问题,下面的玩具示例使用clang -ansi干净地进行了编译
int main(void)
{
for (int i = 0; 0; );
return i;
}
但是gcc -ansi给出了以下错误:
a.c: In function ‘main’:
a.c:3:5: error: ‘for’ loop initial declarations are only allowed in C99 mode
a.c:3:5: note: use option -std=c99 or -std=gnu99 to compile your code
使用clang -
我看到了一些像这样的C代码:
int check = 10:
switch(check) {
case 1...9: printf("It is 2 to 9");break;
case 10: printf("It is 10");break;
}
这个case 1...9:是什么意思?它是标准的吗?
当我试图使用makefile运行我的代码时,我得到了这个错误:
find_bits.o: In function `__x86.get_pc_thunk.bx':
(.text+0x30): multiple definition of `__x86.get_pc_thunk.bx'
/usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crti.o:(.gnu.linkonce.t.__x86.get_pc_thunk.bx+0x0): first defined here
find_bits.o: In function
我注意到这个代码:
#include <iostream>
using namespace std;
int main () {
int k;
cin >> k;
int n[k];
for (int i = 0; i < k; i++)
n[i] = i;
for (int i = 0; i < k; i++)
cout << n[i] << " ";
return 0;
}
编译得很好。有人能澄清这一点吗,因为据我所知,静态数组必须
使用标志-std=c++14编译的程序也使用在较新版本的C++中实现的特性,并发出如下警告:
warning: inline variables are only available with -std=c++17 or -std=gnu++17
我不希望g++在这种情况下编译程序,也不知道为什么会这样。
我发现添加标志-Werror会将上述警告转换为错误,确保程序不编译,但我不确定这是否是建议的方法。
所以我的任务是编写一个C++程序,将二进制、八进制或十六进制数字转换为十进制,我这样做了,下面是我的代码:
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
long two2ten(string s)
{
int m = 0;
for (size_t i = 0; i < s.size(); i++)
{
m = 2 * m + (s[i] - '0');
}
return m
在使用#warning指令时,我得到的不是一个警告,而是两个警告-我生成的那个,外加一个额外的warning: #warning is a GCC extension [enabled by default]。
我可以用-Wno-cpp抑制#warning指令的结果本身,但这与我想要的相反。
我可以通过使用#pragma message()来解决这个问题,但这似乎会使#warning指令变得毫无意义--有没有办法抑制这个警告?