簡體   English   中英

錯誤:“參數”未命名類型,.cpp和.h文件可能存在問題

[英]Error: 'argument' does not name a type, supposed problems with .cpp and .h files

我讀了好幾個小時的這個問題(似乎很常見),卻沒有找到適合我情況的解決方案。 我了解可能與包含的文件和庫有關,但是我實際上無法找到問題所在。

這是一個使用MQTT客戶端庫的Arduino腳本。 它與舊的PubSubClient.h庫完美配合。

現在我想用最近的一個庫來更新。 函數定義已更改,因此我在草圖中進行了更改,並切換了Arduino / library目錄中的lib,然后重新啟動了Arduino IDE。 我收到很多“錯誤:'參數'沒有命名類型”,我真的不知道要解決什么。

在這里,您可以找到.h和.cpp文件的組織來了解發生了什么。

//device.ino文件

#include "device.h"

//device.h文件

#ifndef DEVICE_H
#define DEVICE_H

#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
#include <ESP8266HTTPUpdateServer.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#include <jsmn.h>
#include <Arduino.h>
#include <pgmspace.h>
#include "mqtt.h"

#endif

mqtt.h文件

#ifndef MQTT_H
#define MQTT_H

#include "device.h"

#endif

mqtt.cpp文件

#include "mqtt.h"

WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);
mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT);
mqtt_client.setCallback(mqtt_callback);

最后,編譯器拋出錯誤:mqtt.cpp:19:錯誤:'mqtt_client'未命名類型

     mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT);

     ^

    mqtt.cpp:20: error: 'mqtt_client' does not name a type

     mqtt_client.setCallback(mqtt_callback);

     ^

    sketch\mqtt.cpp: In function 'void mqtt_publish_mex(String, String, bool)':

    mqtt.cpp:27: error: no matching function for call to 'PubSubClient::publish(String&, String&, bool&)'

             if (mqtt_client.publish(topic, jmex, retained)) {

                                                          ^

    sketch\mqtt.cpp:27:54: note: candidates are:

    In file included from sketch\Walvola.h:25:0,

                     from sketch\mqtt.h:4,

                     from sketch\mqtt.cpp:1:

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note: boolean PubSubClient::publish(const char*, const char*)

        boolean publish(const char* topic, const char* payload);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note:   candidate expects 2 arguments, 3 provided

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note: boolean PubSubClient::publish(const char*, const char*, boolean)

        boolean publish(const char* topic, const char* payload, boolean retained);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note:   no known conversion for argument 1 from 'String' to 'const char*'

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int)

        boolean publish(const char* topic, const uint8_t * payload, unsigned int plength);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note:   no known conversion for argument 1 from 'String' to 'const char*'

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean)

        boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note:   candidate expects 4 arguments, 3 provided

    sketch\mqtt.cpp: In function 'void mqtt_log(String)':

    mqtt.cpp:347: error: no matching function for call to 'PubSubClient::publish(const String&, String&)'

             mqtt_client.publish(mqtt_controllers_topic_debug, json_string);

                                                                          ^

    sketch\mqtt.cpp:347:70: note: candidates are:

    In file included from sketch\Walvola.h:25:0,

                     from sketch\mqtt.h:4,

                     from sketch\mqtt.cpp:1:

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note: boolean PubSubClient::publish(const char*, const char*)

        boolean publish(const char* topic, const char* payload);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:130:12: note:   no known conversion for argument 1 from 'const String' to 'const char*'

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note: boolean PubSubClient::publish(const char*, const char*, boolean)

        boolean publish(const char* topic, const char* payload, boolean retained);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:131:12: note:   candidate expects 3 arguments, 2 provided

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int)

        boolean publish(const char* topic, const uint8_t * payload, unsigned int plength);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:132:12: note:   candidate expects 3 arguments, 2 provided

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note: boolean PubSubClient::publish(const char*, const uint8_t*, unsigned int, boolean)

        boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);

                ^

    C:\Users\Fabrizio & Dario\Documents\Arduino\libraries\pubsubclient\src/PubSubClient.h:133:12: note:   candidate expects 4 arguments, 2 provided

    In file included from sketch\mqtt.h:4:0,

                     from sketch\mqtt.cpp:1:

    sketch\mqtt.cpp: In function 'void mqtt_callback(char*, byte*, unsigned int)':

    mqtt.cpp:375: error: request for member 'payload_string' in 'payload', which is of non-class type 'byte* {aka unsigned char*}'

             log(payload.payload_string());

                         ^

    sketch\Walvola.h:89:67: note: in definition of macro 'log'

     #define log(mex) if (DEBUG) {Serial.println(walvola_time + "::" + mex);Serial.flush(); if(MQTT_DEBUG) {mqtt_log(walvola_time + "::" + mex);}}

                                                                       ^

    mqtt.cpp:375: error: request for member 'payload_string' in 'payload', which is of non-class type 'byte* {aka unsigned char*}'

             log(payload.payload_string());

                         ^

    sketch\Walvola.h:89:135: note: in definition of macro 'log'

     #define log(mex) if (DEBUG) {Serial.println(walvola_time + "::" + mex);Serial.flush(); if(MQTT_DEBUG) {mqtt_log(walvola_time + "::" + mex);}}

                                                                                                                                           ^

    mqtt.cpp:379: error: request for member 'payload_string' in 'payload', which is of non-class type 'byte* {aka unsigned char*}'

             if (mqtt2JSONkvs(payload.payload_string())) {

                                      ^

    mqtt.cpp:404: error: a function-definition is not allowed here before '{' token

     {

     ^

    mqtt.cpp:512: error: expected '}' at end of input

     }

     ^

    Più di una libreria trovata per "WiFiClient.h"
    Usata: C:\Users\Fabrizio & Dario\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.3.0\libraries\ESP8266WiFi
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi
    Non usata: C:\Program Files (x86)\Arduino\libraries\WiFi
    exit status 1
    'mqtt_client' does not name a type

謝謝您的幫助!

寫作時

WiFiClient wifi_client;
PubSubClient mqtt_client(wifi_client);
mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT);
mqtt_client.setCallback(mqtt_callback);

前兩行還不錯=>您正在聲明名為wifi_clientmqtt_client全局變量

問題來自電話

mqtt_client.setServer(mqtt_server, MQTT_BROKER_PORT);
mqtt_client.setCallback(mqtt_callback);

您可以在全局范圍內聲明變量,但不能在函數外部調用函數(除非用於全局變量初始化),這就是為什么會出現此錯誤的原因。 您所指向的示例有所不同,因為變量位於函數中,因此,在其后立即調用方法是合法的:您位於函數上下文中。

因此,例如,您需要在main()函數中移動調用,以使代碼有效。

也就是說,將全局變量放在標頭中可能會給您帶來更多麻煩,因為您包含了來自不同cpp文件的文件,編譯器將抱怨多個定義,但這不是(這里)問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM