Error use of undeclared identifier strlen

Samples fail to build on latest Win10 setup. Steps to reproduce: Fresh install of Android Studio on Windows Config AS to install latest platform-tools (28.0.0), NDK (17.1.4828580), SDK Tools (26.1....

Samples fail to build on latest Win10 setup.

Error while executing process C:AndroidSDKcmake3.6.4111459bincmake.exe with arguments {--build C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesandroiddraw_textured_cube.externalNativeBuildcmakedebugx86 --target vulkan_sample}
[1/5] Building CXX object utils/CMakeFiles/vsamputils.dir/util.cpp.o
FAILED: C:AndroidSDKndk-bundletoolchainsllvmprebuiltwindows-x86_64binclang++.exe  --target=i686-none-linux-android --gcc-toolchain=C:/Android/SDK/ndk-bundle/toolchains/x86-4.9/prebuilt/windows-x86_64 --sysroot=C:/Android/SDK/ndk-bundle/sysroot   -IC:/Android/git/android-ndk/API-Samples/data -IC:/Android/SDK/ndk-bundle/sources/third_party/shaderc/third_party/glslang -IC:/Android/git/android-ndk/VulkanAPIsamples/API-Samples/utils -IC:/Android/SDK/ndk-bundle/sources/android/native_app_glue -IC:/Android/git/android-ndk/VulkanAPIsamples/API-Samples/utils/../android/vulkan_wrapper -IC:/Android/git/android-ndk/VulkanAPIsamples/API-Samples/utils/../data -IC:/Android/SDK/ndk-bundle/sources/third_party/shaderc/include -isystem C:/Android/SDK/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include -isystem C:/Android/SDK/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/x86/include -isystem C:/Android/SDK/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/include/backward -isystem C:/Android/SDK/ndk-bundle/sysroot/usr/include/i686-linux-android -D__ANDROID_API__=24 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -mstackrealign -Wa,--noexecstack -Wformat -Werror=format-security   -std=c++11  -Werror -DVK_USE_PLATFORM_ANDROID_KHR -O0 -fno-limit-debug-info  -fPIC -MD -MT utils/CMakeFiles/vsamputils.dir/util.cpp.o -MF utilsCMakeFilesvsamputils.dirutil.cpp.o.d -o utils/CMakeFiles/vsamputils.dir/util.cpp.o -c C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesutilsutil.cpp
C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesutilsutil.cpp:232:9: error: use of undeclared identifier 'strncmp'
    if (strncmp(magicStr, "P6", sizeof(magicStr))) {
        ^
C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesutilsutil.cpp:515:44: error: use of undeclared identifier 'strlen'
        compiler.CompileGlslToSpv(pshader, strlen(pshader), MapShadercType(shader_type), "shader");
                                           ^
C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesutilsutil.cpp:564:37: error: use of undeclared identifier 'strlen'
    if (strncmp(option, optionLine, strlen(option)) == 0)
                                    ^
C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesutilsutil.cpp:815:13: error: use of undeclared identifier 'memcpy'; did you mean 'wmemcpy'?
            memcpy(writebuf, this->pbase(), this->pptr() - this->pbase());
            ^~~~~~
            wmemcpy
C:/Android/SDK/ndk-bundle/sysroot/usr/includewchar.h:175:10: note: 'wmemcpy' declared here
wchar_t* wmemcpy(wchar_t* __dst, const wchar_t* __src, size_t __n);
         ^
C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesutilsutil.cpp:815:20: error: cannot initialize a parameter of type 'wchar_t *' with an lvalue of type 'char [129]'
            memcpy(writebuf, this->pbase(), this->pptr() - this->pbase());
                   ^~~~~~~~
C:/Android/SDK/ndk-bundle/sysroot/usr/includewchar.h:175:27: note: passing argument to parameter '__dst' here
wchar_t* wmemcpy(wchar_t* __dst, const wchar_t* __src, size_t __n);
                          ^
C:Androidgitandroid-ndkVulkanAPIsamplesAPI-Samplesutilsutil.cpp:955:12: error: use of undeclared identifier 'EACCES'
    return EACCES;  // can't provide write access to the apk
           ^
6 errors generated.
ninja: build stopped: subcommand failed.

Я пытаюсь преобразовать свой базовый код C в C ++, используя синтаксис C ++ вместо синтаксиса C, если это имеет смысл. Однако у меня проблема. Я не знаю, как использовать strlen() в C ++. При предварительной обработке у меня есть #include <iostream> #include <string> и using namespace std;. Когда я пытаюсь скомпилировать, он выдавал следующие сообщения об ошибках:

error: use of undeclared identifier 'strlen'
int n = strlen(MessagetEnc);

А также

error: use of undeclared identifier 'strlen'
for (int i = 0; i < strlen(MessagetEnc); i++)

Кроме того, использование #include <cstring>, похоже, не решает проблему.

Это код:

#include <iostream>
#include <string>
using namespace std;
    
int main () 
{
    int EncCode; 
    std::cout << "Encryption code: " << std::endl;
    std::cin >> EncCode; 
    
    string MessagetEnc;
    std::cout << "Message to Encrypt:";
    std::cin >> MessagetEnc;
    std::cout << "Output: " << endl;
    
    int n = strlen(MessagetEnc);
    for (int i = 0; i < strlen(MessagetEnc); i++)
    {
        std::cout <<"Encrypted message" << MessagetEnc[i];
    }
}

Я знаю, что C ++ не удобен для новичков, я просто хотел попробовать его после прочтения нескольких статей, так как планирую полностью изучить его после того, как выйду из «стадии новичка».

Изменить: std:: есть, потому что я пытался избавиться от using namespace std; как способ отладки.

3 ответа

Лучший ответ

Есть два распространенных способа хранения строк в C ++. Старый способ C-стиля, в этом случае вы определяете массив символов, а указывает конец строки.

char str[500] = "Hello";
// How ever the capacity of str is 500, but the end of the actual string
// must be indicated by zero () within the str and Compiler puts it
// automatically when you initialize it by a constant string.
// This array contains {'H', 'e', 'l', 'l', 'o', ''}

int len = strlen(str);
// To get the actual length you can use above function

Другой способ определить строку — использовать std::string.

std::string str = "Hello";
int len = str.size();


4

masoud
14 Апр 2021 в 08:21

Попробуйте использовать файл заголовка cstring

В c ++ класс strlen находится в файле cstring.


-1

Dharman
14 Апр 2021 в 08:24

Я пытаюсь интегрировать библиотеку P2P в код iOS, она содержит низкоуровневые библиотеки и файлы классов. Я правильно указал путь ко всем библиотекам и файлам заголовков в настройках сборки. Теперь, когда я создаю библиотеку, я получаю следующую ошибку:

/pjlib/include/pj/string.h:94:33: Use of undeclared identifier 'strlen'
/pjlib/include/pj/string.h:473:20: Use of undeclared identifier 'memchr'
/pjlib/include/pj/string.h:616:5: Use of undeclared identifier 'memset'

Также это дало ошибку математической функции: /External/ASIHTTPRequest/ASIAuthenticationDialog.m:156:83: Использование необъявленного идентификатора «M_PI»

Пожалуйста, дайте мне некоторое представление о том, в чем должна быть проблема… я даю ссылку на снимок моих настроек сборки.

Заголовки в настройках сборки
Путь поиска библиотеки

0 ответы

Не тот ответ, который вы ищете? Просмотрите другие вопросы с метками

iphone
ios
ios6
p2p
rtsp

or задайте свой вопрос.

When compiling this code getting mutltiple errors any idee why is the couse of these errors thanks.

#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>


//This boolean will store true ore false
bool control_caesar_key(string s);

int main(int argc, string argv[])
{
    //Comment
    if (argc != 2 || !control_caesar_key(argv[1]))
    {
        printf("Usage: ./ceasar keyn");
        return 1;
    }

    //To use this atoi function added stdlib.h to the library
    int key = atoi(argv[1]);

    string text = get_string("plaintext: ");

        printf("ciphertext: ");

    //This formula will encrypt the messages by rotating each letter position and
    //to come plaintext from ASCII example if k is 27 = A. A should become 27
    //position away from B. This will provide wrap around from Z to A and so on.

    for (int i = 0, len = strlen(text); i < len; i++)
    {
        char ci = (text[i]);
        if (isalpha(ci))
        {
            char j = 'A';
        if (islower(ci))
            char j = 'a';
        printf("%c", (ci - j + key) %26 + j);
    }

    else
        printf("%c", ci);
    }
    printf("n");
}

bool control_caesar_key(string s)
 {
    if (int i = 0, len = strlen(s); i < len; i++)

        if (!isdigit(s[i]))
        return false;
    return true;
}

Errors

   

~/pset2/caesar/ $ make caesar
clang -ggdb3 -O0 -std=c11 -Wall -Werror -Wextra -Wno-sign-compare -Wno-unused-parameter -Wno-unused-variable -Wshadow    caesar.c  -lcrypt -lcs50 -lm -o caesar

caesar.c:50:9: error: expected expression
    if (int i = 0, len = strlen(s); i < len; i++)
        ^
caesar.c:50:37: error: use of undeclared identifier 'i'
    if (int i = 0, len = strlen(s); i < len; i++)
                                    ^
caesar.c:50:41: error: use of undeclared identifier 'len'
    if (int i = 0, len = strlen(s); i < len; i++)
                                        ^
caesar.c:50:46: error: use of undeclared identifier 'i'
    if (int i = 0, len = strlen(s); i < len; i++)
                                             ^
4 errors generated.
make: *** [<builtin>: caesar] Error 1
~/pset2/caesar/ $ 

Что такое необъявленные ошибки идентификатора? Каковы общие причины и как их исправить?

Пример текстов ошибок:

  • Для компилятора Visual Studio: error C2065: 'cout' : undeclared identifier
  • Для компилятора GCC: 'cout' undeclared (first use in this function)

39

Решение

Чаще всего они приходят из-за того, что забывают включить заголовочный файл, содержащий объявление функции, например, эта программа выдаст ошибку «необъявленный идентификатор»:

Отсутствует заголовок

int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}

Чтобы это исправить, мы должны включить заголовок:

#include <iostream>
int main() {
std::cout << "Hello world!" << std::endl;
return 0;
}

Если вы написали заголовок и включили его правильно, заголовок может содержать неправильный включить охрану.

Чтобы узнать больше, смотрите http://msdn.microsoft.com/en-us/library/aa229215(v=vs.60).aspx.

Переменная с ошибкой

Другой распространенный источник ошибки новичка возникает, когда вы неправильно написали переменную:

int main() {
int aComplicatedName;
AComplicatedName = 1;  /* mind the uppercase A */
return 0;
}

Неправильный объем

Например, этот код выдаст ошибку, потому что вам нужно использовать std::string:

#include <string>

int main() {
std::string s1 = "Hello"; // Correct.
string s2 = "world"; // WRONG - would give error.
}

Использовать до объявления

void f() { g(); }
void g() { }

g не был объявлен до его первого использования. Чтобы это исправить, либо переместите определение g до f:

void g() { }
void f() { g(); }

Или добавить декларацию g до f:

void g(); // declaration
void f() { g(); }
void g() { } // definition

stdafx.h не сверху (специфично для VS)

Это зависит от Visual Studio. В VS нужно добавить #include "stdafx.h" перед любым кодом. Код до того, как он игнорируется компилятором, так что если у вас есть это:

#include <iostream>
#include "stdafx.h"

#include <iostream> будет проигнорировано Вам нужно переместить его ниже:

#include "stdafx.h"#include <iostream>

Не стесняйтесь редактировать этот ответ.

54

Другие решения

Рассмотрим похожую ситуацию в разговоре. Представьте, что ваш друг говорит вам: «Боб идет на ужин», а ты не представляешь, кто такой Боб. Вы будете в замешательстве, верно? Твой друг должен был сказать: «У меня есть коллега по работе по имени Боб. Боб подходит к обеду». Теперь Боб объявлен, и вы знаете, о ком говорит ваш друг.

Компилятор выдает ошибку «необъявленный идентификатор», когда вы пытаетесь использовать какой-то идентификатор (который будет именем функции, переменной, класса и т. Д.), И компилятор не видит объявления для него. То есть компилятор понятия не имеет, о чем вы говорите, потому что раньше его не видел.

Если вы получаете такую ​​ошибку в C или C ++, это означает, что вы не сказали компилятору о том, что вы пытаетесь использовать. Объявления часто встречаются в заголовочных файлах, поэтому, скорее всего, это означает, что вы не включили соответствующий заголовок. Конечно, может случиться так, что вы просто не помните, чтобы объявить сущность вообще.

Некоторые компиляторы выдают более конкретные ошибки в зависимости от контекста. Например, пытаясь скомпилировать X x; где тип X не был объявлен с Clang скажет вам «неизвестное имя типа X«. Это гораздо полезнее, потому что вы знаете, что он пытается интерпретировать X как тип. Тем не менее, если у вас есть int x = y;, где y еще не объявлено, он скажет вам «использование необъявленного идентификатора y«потому что есть некоторая двусмысленность в том, что именно y может представлять.

12

У меня была такая же проблема с пользовательским классом, который был определен в пространстве имен. Я пытался использовать класс без пространства имен, вызывая ошибку компилятора «идентификатор» MyClass «не определен».
Добавление

using namespace <MyNamespace>

или используя класс, как

MyNamespace::MyClass myClass;

решил проблему.

5

В C и C ++ все имена должны быть объявлены перед использованием. Если вы попытаетесь использовать имя переменной или функции, которая не была объявлена, вы получите ошибку «необъявленный идентификатор».

Однако функции — это особый случай в C (и только в C), в котором вам не нужно сначала объявлять их. Компилятор C будет предполагать, что функция существует с числом и типом аргументов, как в вызове. Если фактическое определение функции не совпадает, вы получите еще одну ошибку. Этот особый случай для функций не существует в C ++.

Вы исправляете ошибки такого рода, проверяя, что функции и переменные объявлены до их использования. В случае printf вам нужно включить заголовочный файл <stdio.h> (или же <cstdio> в C ++).

Для стандартных функций я рекомендую вам проверить, например, этот справочный сайт, и найдите функции, которые вы хотите использовать. Документация для каждой функции говорит вам, какой заголовочный файл вам нужен.

4

Эти сообщения об ошибках

1.For the Visual Studio compiler: error C2065: 'printf' : undeclared identifier
2.For the GCC compiler: `printf' undeclared (first use in this function)

означает, что вы используете имя printf но компилятор не видит, где было объявлено имя, и, соответственно, не знает, что это значит.

Любое имя, используемое в программе, должно быть объявлено до ее использования. Компилятор должен знать, что обозначает имя.

В этом конкретном случае компилятор не видит объявление имени printf , Как мы знаем (но не компилятор) это имя стандартной функции C, объявленной в заголовке <stdio.h> в C или в заголовке <cstdio> в C ++ и размещены в стандарте (std::) и глобальный (::) (не обязательно) пространства имен.

Поэтому, прежде чем использовать эту функцию, мы должны предоставить объявление ее имени компилятору путем включения соответствующих заголовков.

Например
C:

#include <stdio.h>

int main( void )
{
printf( "Hello Worldn" );
}

C ++:

#include <cstdio>

int main()
{
std::printf( "Hello Worldn" );
// or printf( "Hello Worldn" );
// or ::printf( "Hello Worldn" );
}

Иногда причиной такой ошибки является простая опечатка. Например, давайте предположим, что вы определили функцию PrintHello

void PrintHello()
{
std::printf( "Hello Worldn" );
}

но в основном вы сделали опечатку и вместо PrintHello ты напечатал printHello с строчной буквы «р».

#include <cstdio>

void PrintHello()
{
std::printf( "Hello Worldn" );
}

int main()
{
printHello();
}

В этом случае компилятор выдаст такую ​​ошибку, потому что он не видит объявление имени printHello, PrintHello а также printHello два разных имени, одно из которых было объявлено, а другое не объявлено, но используется в теле основного

3

Это похоже на использование функции без ее объявления. заголовочный файл будет содержать
функция printf (). Включите заголовочный файл в вашу программу, это решение для этого.
Некоторые пользовательские функции могут также вызывать ошибки, если они не были объявлены перед использованием. Если
это используется во всем мире без проб.

0

В большинстве случаев, если вы уверены, что импортировали данную библиотеку, Visual Studio поможет вам с IntelliSense.

Вот что сработало для меня:

Удостоверься что #include "stdafx.h" объявляется первым, то есть вверху всех ваших включений.

0

Понравилась статья? Поделить с друзьями:
  • Error using horzcat dimensions of arrays being concatenated are not consistent
  • Error using horzcat cat arguments dimensions are not consistent
  • Error use of undeclared identifier nullptr
  • Error using fprintf invalid file identifier use fopen to generate a valid file identifier
  • Error use of undeclared identifier itoa