I keep getting this compiler error for a specific file. It seems to be complaining about the length of a define, but I have shortened it over and over and it's still complaining. It'll complain about a random line, it's always different. How do I get passed this error so I can compile my code?
In Pelles C max line length is below 4096 chars.
EDIT:
QuoteWG14/N1256 Committee Draft โ Septermber 7, 2007 ISO/IEC 9899:TC3
โ4095 characters in a logical source line
โ4095 characters in a character string literal or wide string literal (after concatenation)
Quote from: TimoVJL on December 09, 2018, 11:49:48 PM
In Pelles C max line length is below 4096 chars.
What is the definition of a "line" then? Because that is definitely not the problem. And I have lines much longer than that.
Input file lines length.
Maximum PellesC input line lenght is 4095 chars.
As previously pointed out by Timo, the limits of translation, specify the length of
logical lines, see
ISO/IEC 9899:2017 ยง5.2.4.1 Translation limits (but also C99-C11), as follow:
Quote
The implementation shall be able to translate and execute at least one program that contains at least
one instance of every one of the following limits:
127 nesting levels of blocks
63 nesting levels of conditional inclusion
12 pointer, array, and function declarators (in any combinations) modifying an arithmetic, structure, union, or void type in a declaration
63 nesting levels of parenthesized declarators within a full declarator
63 nesting levels of parenthesized expressions within a full expression
63 significant initial characters in an internal identifier or a macro name(each universal character name or extended source character is considered a single character)
31 significant initial characters in an external identifier (each universal character name specifying a short identifier of 0000FFFF or less is considered 6 characters, each universal character name specifying a short identifier of 00010000 or more is considered 10 characters, and each extended source character is considered the same number of characters as the corresponding universal character name, if any)
4095 external identifiers in one translation unit
511 identifiers with block scope declared in one block
4095 macro identifiers simultaneously defined in one preprocessing translation unit
127 parameters in one function definition
127 arguments in one function call
127 parameters in one macro definition
127 arguments in one macro invocation
4095 characters in a logical source line
4095 characters in a string literal (after concatenation)
65535 bytes in an object (in a hosted environment only)
15 nesting levels for #included files
1023 case labels for a switch statement (excluding those for any nested switch statements)
1023 members in a single structure or union
1023 enumeration constants in a single enumeration
63 levels of nested structure or union definitions in a single struct-declaration-list
You should check that your source is compliant with each one of the limits above, if your code can compile with a different compiler it should be considered a custom extension of such a compiler, and then
the code not portable.
But if I need to use huge string? I tried to put it into resources or into char.. , anyway i see this error.
How i can split the string and merge into memory?
don't want to use visual studio, because it sucks.
A string was not a OP problem.
A huge string can combined from shorter lines.
char *huge_str =
"...."
... repeat parts
"....";
TimoVJL try to put this, in my Pelles it's fail..
https://pastebin.com/8GL5MPuX
You could break the data up into large chunks and then combine them. As with this example.
#include <stdio.h>
#include <tchar.h>
#include <mapidefs.h>
/// @def NELEMS(a)
///
/// @brief Computes number of elements of an array.
///
/// @param a An array.
#define NELEMS(a) (sizeof(a) / sizeof((a)[0]))
// Create a circular buffer (for Join())
static LPTSTR *ppBuffer = NULL;
/// @brief Concatenates two sub strings into a new string.
///
/// @param str1 A string
/// @param str2 Another string.
///
/// @returns A pointer to a temporarily allocated string.
LPTSTR Join(LPTSTR str1, LPTSTR str2)
{
register INT tmplen = 0;
register LPTSTR strtmp;
static INT StrCnt = 0;
if(NULL == ppBuffer) // initialize buffer
{
ppBuffer = (LPTSTR *) calloc(2, sizeof(LPTSTR));
}
tmplen = _tcslen(str1) + _tcslen(str2);
StrCnt = (StrCnt + 1) & 1;
if (ppBuffer[StrCnt])
free(ppBuffer[StrCnt]);
strtmp = (ppBuffer[StrCnt] = (LPTSTR)calloc(tmplen + 1, sizeof(TCHAR)));
_tcscat(strtmp, str1);
_tcscat(strtmp, str2);
return strtmp;
}
int main(int argc, char *argv[])
{
LPTSTR arrStrings[4];
arrStrings[0] = "Big string 1 + ";
arrStrings[1] = "Big string 2 + ";
arrStrings[2] = "Big string 3 + ";
arrStrings[3] = "Big string 4";
LPTSTR heapString = "";
for(int i = 0; i < NELEMS(arrStrings); i++)
{
heapString = Join(heapString,arrStrings[i]);
}
printf("%s\n",heapString);
return _getch();
}
Hard to say much without sample code, but you can also get this error if a macro invocation contains unbalanced parenthesis for example (the compiler thinks the macro goes on, and on, and on, and...)
Test case for error #2076: String literal too long.
ISO sets a limit of 4095 characters in a string literal after concatenation. Pelles C will accept more, but there must still be a limit.
Anyway, the original complain was about "input buffer overflow" not "string literal too long". Getting off topic, me thinks...