Toon posts:

[Visual C++] '_snprintf' identifier not found*

Pagina: 1
Acties:
  • 161 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo iedereen.. heb me ook maar geregisteerd

ik had een klein progje gemaakt voor het renamen van bestanden. als console bestand werkte het perfect in dev c++ maar nu probeer ik dat stukje code in visual c++ te verwerken maar ik loop tegen een paar problemen waat ik maar niet uit kom.
bij het compile geeft hij een probleem met snprintf..

------ Rebuild All started: Project: test zomaar, Configuration: Debug Win32 ------
Deleting intermediate and output files for project 'test zomaar', configuration 'Debug|Win32'
Compiling...
stdafx.cpp
Compiling...
AssemblyInfo.cpp
test zomaar.cpp
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(104) : error C3861: '_snprintf': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(105) : error C3861: '_snprintf': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(106) : error C3861: 'rename': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(109) : error C3861: '_snprintf': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(110) : error C3861: 'rename': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(115) : error C3861: '_snprintf': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(116) : error C3861: 'remove': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(120) : error C3861: '_snprintf': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(121) : error C3861: 'remove': identifier not found
D:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(286) : error C2365: 'remove' : redefinition; previous definition was 'formerly unknown identifier'
D:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(287) : error C2365: 'rename' : redefinition; previous definition was 'formerly unknown identifier'
D:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h(339) : error C2365: '_snprintf' : redefinition; previous definition was 'formerly unknown identifier'
Generating Code...
Build log was saved at "file://d:\Documents and Settings\wim\Mijn documenten\Visual Studio 2005\Projects\test zomaar\test zomaar\Debug\BuildLog.htm"
test zomaar - 12 error(s), 0 warning(s)
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========

op deze manier gebruik ik _snprintf

char buffer[13],new_buffer[13];
_snprintf(buffer,13, "%06il.jpg", counter);
_snprintf(new_buffer,13, "%06i.jpg", counter);

iemand een idee wat het zou kunnen wezen?

  • MTWZZ
  • Registratie: Mei 2000
  • Laatst online: 13-08-2021

MTWZZ

One life, live it!

Headers goed geinclude? Libs meegelinkt?

Ik heb geen C++ op windows ervaring maar moet je niet snprintf ipv _snprintf doen?

Nu met Land Rover Series 3 en Defender 90


  • moto-moi
  • Registratie: Juli 2001
  • Laatst online: 09-06-2011

moto-moi

Ja, ik haat jou ook :w

ANSI C Compliance

The naming convention for all Microsoft-specific identifiers in the run-time system (such as functions, macros, constants, variables, and type definitions) is ANSI-compliant. In this book, any run-time function that follows the ANSI/ISO C standards is noted as being ANSI compatible. ANSI-compliant applications should only use these ANSI compatible functions.

The names of Microsoft-specific functions and global variables begin with a single underscore. These names can be overridden only locally, within the scope of your code. For example, when you include Microsoft run-time header files, you can still locally override the Microsoft-specific function named _open by declaring a local variable of the same name. However, you cannot use this name for your own global function or global variable.

The names of Microsoft-specific macros and manifest constants begin with two underscores, or with a single leading underscore immediately followed by an uppercase letter. The scope of these identifiers is absolute. For example, you cannot use the Microsoft-specific identifier _UPPER for this reason.

God, root, what is difference? | Talga Vassternich | IBM zuigt


Verwijderd

Topicstarter
uhm als ik het goed begrijp denk jij dat ik een locale variable aanmaak die _snprintf heet?
ik ben net begonnen met visual c++ dus tis nog effe puzzelen

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 22:07

NMe

Quia Ego Sic Dico.

Is er een reden voor dat je niet gewoon snprintf uit stdio.h gebruikt?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Verwijderd

Topicstarter
nee niet echt een reden maar snprintf geeft de zelfde fout.
en _snprintf heb ik een keer in een project week gebruikt en daar dus van overgenomen

als ik snprintf gebruik krijg ik dit:

code:
1
2
3
4
5
6
7
8
9
10
11
------ Build started: Project: test zomaar, Configuration: Debug Win32 ------
Compiling...
test zomaar.cpp
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(102) : error C3861: 'snprintf': identifier not found
d:\documents and settings\wim\mijn documenten\visual studio 2005\projects\test zomaar\test zomaar\Form1.h(104) : error C2664: 'void System::Windows::Forms::Control::Text::set(System::String ^)' : cannot convert parameter 1 from 'char [13]' to 'System::String ^'
        Reason: cannot convert from 'char *' to 'System::String ^'
        No user-defined-conversion operator available, or
        Cannot convert an unmanaged type to a managed type
Build log was saved at "file://d:\Documents and Settings\wim\Mijn documenten\Visual Studio 2005\Projects\test zomaar\test zomaar\Debug\BuildLog.htm"
test zomaar - 2 error(s), 0 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

ik hoef toch geen lib files toe te voegen?

  • Super_ik
  • Registratie: Maart 2001
  • Laatst online: 20:42

Super_ik

haklust!

heb je wel die 2 standaart includes van vc++ laten staan?

8<------------------------------------------------------------------------------------
Als ik zo door ga haal ik m'n dood niet. | ik hou van goeie muziek


Verwijderd

Topicstarter
dit zijn op dit moment al men includes:

#include "stdafx.h"
#include "Form1.h"
//#include <cstdlib>
//#include <iostream>
#include <stdio.h>

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14-04 03:50
Je moet inderdaad snprintf() gebruiken; identifiers met 1 of 2 underscores zijn gereserveerd en bij normaal gebruikt moet je die dus inderdaad niet gebruiken. (Intern worden ze wel gebruikt, vandaar dat het misschien toevalligerwijs wel werkte met GCC).

Verder lijkt het erop dat je in Visual Studio een .NET-applicatie build (een 'CLR' project ipv een 'Win32' project) terwijl je broncode duidelijk in C geschreven is. Dat gaat natuurlijk niet werken; maak er maar eens een Win32 Console Application of Win32 Project van. Dan heb je verder inderdaad geen libraries nodig (de standaard C en C++ library wordt automatisch meegelinkt).

offtopic:
Ik moet trouwens zeggen dat ik de reacties in dit topic niet bijzonder hulpzaam vind; fijn dat er veel mensen de TS willen helpen, maar zorg dan wel dat je een beetje weet waar het over gaat, anders wordt de verwarring alleen maar groter. ;)

Verwijderd

Topicstarter
tja mijn bedoeling was een windows achtig programma te maken... maar daarvoor heb ik die CLR opmaak toch nodig?
want een command line versie had ik al gemaakt in dev c++

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 14-04 03:50
Ok, maar dan moet je de problemen even duidelijk scheiden. In de TS had je het over een C programma dat je wel met GCC kon compileren maar niet met Visual C++; daat heeft niets met .NET te maken want dat ondersteunt GCC niet. Je snprintf() probleem is nu opgelost, dus?

De vraag is wat nu je nieuwe probleem is; wil je een .NET applicatie schrijven of een Win32 applicatie? Wat noem je een 'Windows achtig' programma?

Als je een .NET applicatie wil maken en je huidige code hergebruiken, dan ben je aangewezen op Managed C++. De CLR gebruikt heel andere datatypes dan C (of C++ for that matter), dus je zult je C-style strings (char*) moeten omzetten naar CLR strings (System::String). Sowieso moet je dan een paar uurtjes uittrekken om Managed C++ te leren, want ik heb niet het idee dat je beseft dat dit een andere (uitgebreidere) programmeertaal is dan C/C++. ;)

Als je echter een Win32 applicatie wil maken (een applicatie met eventueel een Windows GUI, maar geen .NET applicatie), dan moet je toch echt een Win32 project maken. In dat geval is het ook handig om je in te lezen in de Win32 API en hoe windows en messages precies werken, want als je met C/C++ bezig bent ga je dat echt nodig hebben (zelfs als je de grafische dialog editor van Visual Studio gebruikt). Overigens kun je zo'n applicatie ook schrijven in Dev-C++, waarmee ik niet wil zeggen dat dat moet, maar dat is dus geen reden om over te stappen op Visual C++.

[ Voor 6% gewijzigd door Soultaker op 21-01-2006 17:21 ]


Verwijderd

Topicstarter
oke hier heb ik me dus wat in vergist.
ik dacht dat ik in een CLR windows form gewoon kon programmeren in c++.
maar dit gaat dus niet op..
ik ga me verder verdiepen in win32 api .
bedankt voor de moeite

  • .oisyn
  • Registratie: September 2000
  • Nu online

.oisyn

Moderator Devschuur®

Demotivational Speaker

Soultaker schreef op zaterdag 21 januari 2006 @ 16:54:
Je moet inderdaad snprintf() gebruiken; identifiers met 1 of 2 underscores zijn gereserveerd en bij normaal gebruikt moet je die dus inderdaad niet gebruiken. (Intern worden ze wel gebruikt, vandaar dat het misschien toevalligerwijs wel werkte met GCC).
Het is niet zijn functie, het is een (niet-ANSI) CRT functie. Omdat ze niet ANSI compliant zijn (en dus MS-specific) beginnen ze met een underscore (omdat jij die zelf niet mag gebruiken, en je daardoor geen nameclashes krijgt). Er zijn wel bepaalde omstandigheden waarin de niet-underscore varianten dmv defines gemapped worden naar hun underscore varianten, maar de underscore variant zou altijd goed moeten werken.
http://msdn.microsoft.com...printf.2c_._snwprintf.asp

Waarom het niet werkt als je gewoon stdio.h geinclude hebt is me een raadsel eerlijk gezegd, je kunt in CLR projecten namelijk wél gewoon native code schrijven (tenzij je aangeeft dat het safe CLR moet zijn)

.edit: heb het even geprobeerd, werkt prima. Niet zonder deprecation warning op _snprintf overigens, er wordt gezegd dat je beter de _snptinf_s functie kunt gebruiken, maar het werkt wel gewoon
C++:
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

using namespace System;
using namespace System::Runtime::InteropServices;

int main()
{
    char buffer[20];
    _snprintf(buffer, 20, "hoi");
    System::Console::WriteLine(Marshal::PtrToStringAnsi(static_cast<IntPtr>(buffer)));
}

[ Voor 31% gewijzigd door .oisyn op 21-01-2006 18:26 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Als je toch serieus met C++ aan de slag wilt kan je je beter alvast inwerken in het gebruik van streams. C-style functies zoals *printf zijn hierdoor min of meer overbodig geworden en het is veiliger en makkelijker in gebruik, zeker als je later nog de STL wilt gaan gebruiken. Wil je toch per se printf etc. gebruiken, maak dan gebruik van de nieuwe headers zonder .h extensie (meestal voorafgegaan door 'c': in jouw geval <cstdio>). Wat je nu aan het doen bent is C programmeren met een C++ compiler. Dat kan, maar in mijn opinie kan je dan beter helemaal voor C kiezen.
Pagina: 1