c++ complier errors:passed arguments, but takes just

类似的错误比如

error: macro "min" passed 3 arguments, but takes just 2 error: expected ‘)’ before ‘const’ 解决方法

最近在Linux环境下编译一个C++项目,遇到了一个很奇怪的错误“:passed arguments, but takes just”,之前也从来没有遇到过这种error,google了一下,综合了一下原因,“宏定义冲突”,因为这个项目里面参加AWS的做法,将所有的宏函数放到了同一个头文件里面,然后不同的头文件又不断的include,于是检查各级的头文件,但是没有发现错误;看了一下stack overflow的解决办法一共就两种。

1、#undef

  使用这个方法的前提是,假定确实因为宏定义冲突导致的这个错误,但是我基本将所有的相关头文件都检查了一遍,都没有发现宏被redefine。具体的办法就是在宏定义的末尾加上#undef 宏名字

2、在宏调用的时候将宏的名字用()括起来

举个例子,

(MIN) (1,2)
//1,2为参数

这两种方法使用都可以解决编译出现的错误,但是找了很久始终没有发现哪里的宏被定义冲突;最后我又重新检查了那个包含所有宏定义的头文件,发现里面的一个宏调用错误,就是在宏定义的时候是3个参数,但是调用的时候却只穿进去2个参数,导致这个错误;改正了后重新make,编译通过!

总结:在Google这个errors的时候,我尝试使用前两个办法解决问题;但是其实我并没有从根本上去解决这个问题,因为我并没有发现哪里的宏被重复定义了;很感谢mentor让我去找真正的错误出在那,而不是去为了解决问题而去解决问题,如果当时那样做了,很明显那个项目在使用的时候肯定是会出现bug的,那个时候将更难发现errors在哪。

最近在ubuntu下编译一个c++的solution,好几个project都得到如下的奇怪错误:


In file included from /usr/include/c++/4.6/bits/char_traits.h:41:0,
                 from /usr/include/c++/4.6/ios:41,
                 from /usr/include/c++/4.6/istream:40,
                 from /share1/linux_1579/include/ospace/std/istream:13,
                 from /share1/linux_1579/include/ospace/osstd/iterator.h:20,
                 from /share1/linux_1579/include/ospace/osstd/list.h:16,
                 from /share1/linux_1579/include/ospace/std/list:15,
                 from ../../include/LrwVUserVars.h:70,
                 from ../../include/LrwLogicMgrUtil.h:19,
                 from LrwLogicMgrUtil.cpp:6:

/usr/include/c++/4.6/bits/stl_algobase.h:233:56: error: macro "min" passed 3 arguments, but takes just 2

/usr/include/c++/4.6/bits/stl_algobase.h:254:56: error: macro "max" passed 3 arguments, but takes just 2
In file included from /usr/include/c++/4.6/bits/char_traits.h:41:0,
                 from /usr/include/c++/4.6/ios:41,
                 from /usr/include/c++/4.6/istream:40,
                 from /share1/linux_1579/include/ospace/std/istream:13,
                 from /share1/linux_1579/include/ospace/osstd/iterator.h:20,
                 from /share1/linux_1579/include/ospace/osstd/list.h:16,
                 from /share1/linux_1579/include/ospace/std/list:15,
                 from ../../include/LrwVUserVars.h:70,
                 from ../../include/LrwLogicMgrUtil.h:19,
                 from LrwLogicMgrUtil.cpp:6:
/usr/include/c++/4.6/bits/stl_algobase.h:187:5: error: expected unqualified-id before ‘const’
/usr/include/c++/4.6/bits/stl_algobase.h:187:5: error: expected ‘)’ before ‘const’

/usr/include/c++/4.6/bits/stl_algobase.h:187:5: error: expected initializer before ‘const’
/usr/include/c++/4.6/bits/stl_algobase.h:210:5: error: expected unqualified-id before ‘const’
/usr/include/c++/4.6/bits/stl_algobase.h:210:5: error: expected ‘)’ before ‘const’
/usr/include/c++/4.6/bits/stl_algobase.h:210:5: error: expected initializer before ‘const’
/usr/include/c++/4.6/bits/stl_algobase.h:233:5: error: ‘std::min’ declared as an ‘inline’ variable
/usr/include/c++/4.6/bits/stl_algobase.h:233:5: error: template declaration of ‘const _Tp& std::min’
/usr/include/c++/4.6/bits/stl_algobase.h:236:7: error: expected primary-expression before ‘if’
/usr/include/c++/4.6/bits/stl_algobase.h:236:7: error: expected ‘}’ before ‘if’
/usr/include/c++/4.6/bits/stl_algobase.h:238:7: error: expected unqualified-id before ‘return’
/usr/include/c++/4.6/bits/stl_algobase.h:254:5: error: ‘max’ declared as an ‘inline’ variable
/usr/include/c++/4.6/bits/stl_algobase.h:254:5: error: template declaration of ‘const _Tp& max’
/usr/include/c++/4.6/bits/stl_algobase.h:257:7: error: expected primary-expression before ‘if’
/usr/include/c++/4.6/bits/stl_algobase.h:257:7: error: expected ‘}’ before ‘if’
/usr/include/c++/4.6/bits/stl_algobase.h:259:7: error: expected unqualified-id before ‘return’
/usr/include/c++/4.6/bits/stl_algobase.h:260:5: error: expected declaration before ‘}’ token


花了很多时间都没有找到解决方法。终于在网上找到一点线索,然后一点一点试找到了一个workaround。其实这个错误与代码本身或g++版本无关,只是因为出现了宏定义冲突:

所以只需把属于自己定义的相关头文件(比如上面的LrwVUserVars.h)中加入(最好加在自己的头文件引用和标准头文件的引用之间):

#include "LrwDomBase.h"
#include "LrwPostId.h"

//added by andy

#undef max
#undef min
 

#include <map>
#include <queue>

则这个问题就不会再出现了。

C是一种编译器,在Matlab2014a中使用。编译器是一种将高级语言代码转换为机器可执行代码的软件工具。Matlab2014a是MathWorks开发的一款数学计算和科学技术计算软件,提供了丰富的工具和函数库,用于处理和分析数据,进行模型建立和仿真等。 使用C编译器在Matlab2014a中可以实现以下功能: 1. 提高计算速度:通过将Matlab代码编译为机器语言,可以大幅提高程序的运行速度。 2. 加密和保护代码:编译后的机器代码无法直接查看和修改,可以保护算法和知识产权。 3. 集成其他语言程序:通过C编译器,可以将其他语言(如C、C++、FORTRAN等)的程序集成到Matlab环境中,实现不同语言的混合编程。 4. 优化矩阵运算:编译器能够对Matlab中的矩阵运算进行优化,提高运行效率。 5. 减少内存占用:编译器可以通过优化算法和内存分配策略,减少程序的内存占用。 使用C编译器的步骤: 1. 编写Matlab代码:使用Matlab编写算法或程序。 2. 编译Matlab代码:在Matlab命令窗口中执行"mex -setup"命令,选择C编译器。 3. 编译代码:使用"mex"命令将Matlab代码编译为机器代码,生成可执行文件。 4. 运行可执行文件:在Matlab环境中执行编译生成的可执行文件,进行计算和数据处理。 需要注意的是,使用C编译器需要具备一定的编程和编译知识,同时还需要安装和配置相应的编译器软件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值