1. 程式人生 > >用C++擴充套件php時函式重定義redefinition問題

用C++擴充套件php時函式重定義redefinition問題

問題:我在用C++擴充套件php時,用到了一些數學庫函式如sqr,sqrt等,需要在C++擴充套件工程的原始檔test.cpp中#include <math.h>,但是編譯時發現這些函數出現了重定義redefinition的問題。

多次嘗試後,發現將test.cpp開頭的#include "php.h" 去掉時,就沒有這個問題了

原因:查詢得知,因為php.h中,將很多C++庫函式做了inline內聯,直接定義在php.h,導致在C++庫函式檔案stdio.h中的同名函式定義識別為重定義(inline修飾的函式不允許在其他檔案定義)

解決:將有重定義函式的C++標頭檔案#include寫在#include ”php.h“之前,遮蔽inline函式,在test.cpp中的位置如下:

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

<strong>#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#include <vector>
#include <set>
#include <queue></strong>

#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
#include "php_NearestNeighbors.h"